Springboot 注解
1|0@validated
服务器和浏览器互不信任,不能因为前端加入参判断了后台就不处理了,这样是不对的。
比如前台传过来一个对象作为入参参数,这个对象中有些属性允许为空,有些属性不允许为空。那么你还在使用if()else{}进行非空判断吗?不妨尝试下使用注解,可以使用@Validated
1|1基础使用
因为spring-boot已经引入了基础包,所以直接使用就可以了
1 首先在controller上声明需要对数据进行校验
2 然后在bean上声明需要被校验的字段
而后,当输入不能满足条件是,就会抛出异常,而后统一由异常中心处理
也可以用BindingResult
,但是用了这个后就必须手动处理异常,侵入了正常的逻辑过程,并不推荐.
说明:若不做异常处理,@Validated注解的默认异常消息如下(示例):
1|2常用注解类型
注意,不要错用了异常类型,比如在int上不可用@size
数值检查,建议使用在Stirng
,Integer
类型,不建议使用在int
类型上,因为表单值为""
时无法转换为int
,但可以转换为Stirng
为""
,Integer
为null
1|3嵌套校验
@Validated或者@Valid区别
@Validated
:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上@Valid
:可以用在方法、构造函数、方法参数和成员属性(字段)上- 两者是否能用于成员属性(字段)上直接影响能否提供
嵌套验证
的功能。
未嵌套情况
比如我们现在有个实体叫做Item
:
Item
带有很多属性,属性里面有:pid
、vid
、pidName
和vidName
,如下所示:
属性这个实体也有自己的验证机制,比如pid
和vid
不能为空,pidName
和vidName
不能为空等。
现在我们有个ItemController
接受一个Item
的入参,想要对Item进行验证,如下所示:
在上图中,如果Item
实体的props
属性不额外加注释,只有@NotNull
和@Size
,无论入参采用@Validated
还是@Valid
验证,Spring Validation
只会对Item
的id
和props
做非空和数量验证,不会对props
字段里的Prop
实体进行字段验证,也就是@Validated
和@Valid
加在方法参数前,都不会自动对参数进行嵌套验证。也就是说如果传的List
中有Prop
的pid
为空或者是负数,入参验证不会检测出来。
嵌套情况
为了能够进行嵌套验证,必须手动在Item
实体的props
字段上明确指出这个字段里面的实体也要进行验证。由于@Validated
不能用在成员属性(字段)上,但是@Valid
能加在成员属性(字段)上,而且@Valid
类注解上也说明了它支持嵌套验证功能,那么我们能够推断出:@Valid
加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上,来配合方法参数上@Validated
或@Valid
来进行嵌套验证。
修改Item类如下所示:
然后我们在ItemController
的addItem
函数上再使用@Validated
或者@Valid
,就能对Item
的入参进行嵌套验证。此时Item
里面的props
如果含有Prop
的相应字段为空的情况,Spring Validation
框架就会检测出来,记录相应的错误。
@Validated和@Valid在嵌套验证功能上的区别
@Validated
:用在方法入参上无法单独提供嵌套验证功能。不能用在成员属性(字段)上,也无法提示框架进行嵌套验证。能配合嵌套验证注解@Valid
进行嵌套验证。
@Valid
:用在方法入参上无法单独提供嵌套验证功能。能够用在成员属性(字段)上,提示验证框架进行嵌套验证。能配合嵌套验证注解@Valid
进行嵌套验证。
1|4BindingResult
bindingResult.hasErrors()
判断是否校验通过,未通过bindingResult.getFieldError().getDefaultMessage()
获取在TestEntity
的属性设置的自定义message
,如果没有设置,则返回默认值javax.validation.constraints.XXX.message
。
2|0@Json***
jackson
的 mavern
依赖
使用的背景
springboot
项目中定义了很多类,我们在rest返回中直接返回或者在返回对象中使用这些类,spring已经使用jackson
自动帮我们完成这些的to json
。但是有时候自动转的json
内容太多,或者格式不符合我们的期望,因此需要调整类的to json过程
,或者说希望自定义类的json过程
。
2|1@JsonProperty
概念
- 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把
trueName
属性序列化为name
,@JsonProperty(“name”)
。 - 对属性名称重命名,比如在很多场景下Java对象的属性是按照规范的驼峰书写,但在数据库设计时使用的是下划线连接方式,此处在进行映射的时候就可以使用该注解。
用法
例如:使用该注解将以下表结构转化为 Javabean
2|2@JsonIgnore
概念
- 用于属性或者方法上(最好是属性上),用来完全忽略被注解的字段和方法对应的属性,即便这个字段或方法可以被自动检测到或者还有其他的注解,一般标记在属性或者方法上,返回的
json
数据即不包含该属性。
用法
使用情景:需要把一个List
转换成json
格式的数据传递给前台。但实体类中基本属性字段的值都存储在快照属性字段中。此时我可以在业务层中做处理,把快照属性字段的值赋给实体类中对应的基本属性字段。最后,我希望返回的json
数据中不包含这两个快照字段,那么在实体类中快照属性上加注解@JsonIgnore
,那么最后返回的json
数据,将不会包含customerId
和productId
两个属性值。
2|3@JsonIgnoreProperties
概念
是类注解,作用是json
序列化时将java bean
中的一些属性忽略掉,序列化和反序列化都受影响。
用法:
@JsonIgnoreProperties(ignoreUnknown = true)
,将这个注解写在类上之后,就会忽略类中不存在的字段。这个注解还可以指定要忽略的字段,例如 @JsonIgnoreProperties(value = {"fullName", "comment"})
说明:User类的fullName
和comment
字段会被@JsonIgnoreProperties
注解忽略。address
字段会被@JsonIgnore
注解忽略。regDate
会按照@JsonFormat(timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm:ss”)
进行格式转。
可以看到返回的对象是User,然后comment
、fullName
、address
属性被忽略了,regDate
的格式进行转换。
2|4@JsonFormat
概念
用于属性或者方法上(最好是属性上),可以方便的把Date类型直接转化为我们想要的模式。
用法
3|0读取配置文件
@ConfigurationProperties
: 是springboot
的注解,用于把主配置文件(application.properties、application.yml
)中配置属性设置到对于的Bean属性上@PropertySource
:是spring的注解,用于加载指定的属性配置文件到Spring的Environment中,可以和@Value
、@ConfigurationProperties
配合使用@EnableConfigurationProperties
: 用来开启ConfigurationProperties
注解配置;如果不使用的话,@ConfigurationProperties
加入注解的类上加@Component
也是可以交于springboot
管理。
3|1读取默认配置文件(application.properties、application.yml)
application.yml
配置:
实现方式一 @ConfigurationProperties + @Component作用于类上
实现方式二 @ConfigurationProperties + @Bean作用在配置类的bean方法上
实现方式三 @ConfigurationProperties注解到普通类、 @EnableConfigurationProperties注解定义为bean
实现方式四 @Value作用属性上
实现方式五 使用自带的Environment对象
3|2读取自定义配置文件(比如:config.properties)
说明: PropertySource默认不支持yml、yaml
config.properties
配置
实现方式一 @Configuration + @PropertySource + Environment
实现方式二 @Component+ @PropertySource + @Value
实现方式三 @Component+ @PropertySource + @ConfigurationProperties
实际使用
__EOF__

本文链接:https://www.cnblogs.com/dongye95/p/15980115.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!