Spring注解之@validated的使用

spring-boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。
比如,我们判断一个输入参数是否合法,可以用如下方式:

一 基础使用

因为spring-boot已经引入了基础包,所以直接使用就可以了

  1. 首先在controller上声明需要对数据进行校验
@RequestMapping(value="/url.json",method= {RequestMethod.POST})
@ResponseBody
@Transactional
public Result<?> xxmethod( @RequestBody @Validated  XoPO xoPo)     
    throws ParseException, UnsupportedEncodingException {}
  1. 然后在bean上声明需要被校验的字段
@data
public class XoPO{
    @validated
    private List<OrderPerson> personList;
    
    @NotNull
    @Size(max=32,message="code is null")
    private String code;

    @NotBlank
    @Size(max=32,message="product is null")
    private String product;
}

而后,当输入不能满足条件是,就会抛出异常,而后统一由异常中心处理
也可以用BindingResult,但是用了这个后就必须手动处理异常,侵入了正常的逻辑过程,并不推荐。

二 常用注解类型

注意,不要错用了异常类型,比如在int上不可用@size,常用注解如下:

@AssertFalse 校验false
@AssertTrue 校验true
@DecimalMax(value=,inclusive=) 小于等于value,inclusive=true,是小于等于
@DecimalMin(value=,inclusive=) 与上类似
@Max(value=) 小于等于value
@Min(value=) 大于等于value
@NotNull  检查Null
@Past  检查日期
@Pattern(regex=,flag=)  正则
@Size(min=, max=)  字符串,集合,map限制大小
@Validate 对po实体类进行校验

三 嵌套校验

如果一个类中包含了另外一个实体类,那么在上面加上@Validated即可,比如上面的:

 public class XoPO {    
    @validated
    private List<PersonDetailPO> personList;
 }

四 @pathvariable的校验

spring-boot可能目前并不支持对参数的验证:https://jira.spring.io/browse…

public Result<?> xoById( @NotNull @NotBlank @Size(min=10,max=32)@PathVariable(value="accountId") String id) {}

但目前还无法抛出异常, 可能在spring的下一个版本中解决,或者不用@Pathvariable,而在service中

Class XoService{
   public xoMethon( @NotNull String id){
   }
}

五 @validated和@valid不同点

在spring项目中,@validated和@valid功能很类似,都可以在controller层开启数据校验功能。
但是@validated和@valid又不尽相同。有以下不同点:

  1. 分组
  2. 注解地方,@Valid可以注解在成员属性(字段)上,但是@Validated不行
  3. 由于第2点的不同,将导致@Validated不能做嵌套校验
  4. @valid只能用在controller。@Validated可以用在其他被spring管理的类上。
    对于第4点的不同,体现了@validated注解其实又更实用的功能。那就是@validated可以用在普通bean的方法校验上。

六 @validated的使用注意点

  1. @validated和@valid都可以用在controller层的参数前面,但这只能在controller层生效。
  2. @validated如果要开启方法验证。注解应该打在类上,而不是方法参数上。
  3. 方法验证模式下,被jsr303标准的注解修饰的可以是方法参数也可以是返回值,类似如下
    public @NotNull Object myValidMethod(@NotNull String arg1, @Max(10) int arg2)
  4. @validated不支持嵌套验证。所以jsr303标准的注解修饰的对象只能基本类型和包装类型。其他类型只能做到检测是否为空,

对于对象里面的jsr303标准的注解修饰的属性,不支持验证。

七 validation与 springboot 结合

1. bean 中添加标签
部分代码: 标签需要加在属性上,@NotBlank 标签含义文章末尾有解释

public class User {
	private Integer id;
 	@NotBlank(message = "{user.name.notBlank}")
 	
 	private String name;
 	private String username;
}

2. Controller中开启验证
在Controller 中 请求参数上添加@Validated 标签开启验证

@RequestMapping(method = RequestMethod.POST)
 
public User create(@RequestBody @Validated User user) {
	return userService.create(user);
}

3. resource 下新建错误信息配置文件
注:此处也可不在配置文件中配置,直接在验证的massage中写。
在resource 目录下新建提示信息配置文件“ValidationMessages.properties“。

注意:名字必须为“ValidationMessages.properties“ 因为SpringBoot自动读取classpath中的ValidationMessages.properties里的错误信息

ValidationMessages.properties 文件的编码为ASCII。数据类型为 key value 。key“user.name.notBlank“为第一步 bean的标签,大括号里面对应message的值,value 为提示信息 ,但是是ASCII 。(内容为“名字不能为空“)
在这里插入图片描述
4. 自定义异常处理器,捕获错误信息
当验证不通过时会抛异常出来,在全局异常中定义异常处理器。捕获异常信息(因为验证不通过的项可能是多个所以统一捕获处理),并抛给前端。
在这里插入图片描述
5. 附上部分标签含义

限制说明
@Null限制只能为null
@NotNull限制必须不为null
@AssertFalse限制必须为false
@AssertTrue限制必须为true
@DecimalMax(value)限制必须为一个不大于指定值的数字
@DecimalMin(value)限制必须为一个不小于指定值的数字
@Digits(integer,fraction)限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future限制必须是一个将来的日期
@Max(value)限制必须为一个不大于指定值的数字
@Min(value)限制必须为一个不小于指定值的数字
@Past限制必须是一个过去的日期
@Pattern(value)限制必须符合指定的正则表达式
@Size(max,min)限制字符长度必须在min到max之间
@Past验证注解的元素值(日期类型)比当前时间早
@NotEmpty验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

6 示例

@Pattern(regexp="^[a-zA-Z0-9]+$",message="{account.username.space}")
@Size(min=3,max=20,message="{account.username.size}")
  • 49
    点赞
  • 159
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 在Spring框架中,@Valid和@Validated是用于验证数据的注解。 @Valid注解是基于JSR-303规范的验证注解,可以用于验证参数、方法返回值、方法参数、方法返回值中的集合等。通过在需要验证的参数对象前添加@Valid注解Spring框架会自动调用相关验证器进行数据验证,并将验证结果封装在BindingResult对象中,可以通过该结果对象获取验证的错误信息。 @Validated注解Spring框架提供的验证注解,通常用于注解在类上,它提供了比@Valid更强大的功能。@Validated注解支持分组验证,可以对同一个对象的不同字段进行不同的验证规则,通过指定不同的验证分组来区分。使用@Validated注解时,需要结合使用@GroupSequence和@GroupSequenceProvider注解来指定验证的顺序和组合。 总结来说,@Valid注解是JSR-303规范的一部分,在Spring框架中使用时表示对参数对象进行数据验证;@Validated注解Spring框架独有的注解,除了支持基本的数据验证外,还支持分组验证,可以根据不同的验证分组对同一个对象的不同字段进行验证。 ### 回答2: spring中的@Valid和@Validated是用于校验数据的注解。 @Validjavax.validation包中的注解,其使用需要在pom.xml中引入javax.validation依赖。@Valid可以用于参数、方法返回值、属性上,它会根据被注解的对象的数据注解进行校验。使用@Valid注解时,需要在类上添加@Validated注解。 @Validatedspring框架提供的注解,它是对@Valid的进一步封装。@Validated可以用于参数、方法返回值、属性、入参方法上。相比于@Valid,@Validated提供了一些额外的校验特性,例如分组校验、方法级别校验等。此外,通过分组校验可以针对不同的校验规则进行不同的校验操作。 使用@Validated注解时,需要在类上添加@EnableValidated注解来启用校验功能。同时,还可以通过在方法参数上使用校验注解来进行单独的数据验证。 总的来说,@Valid和@Validated都是用于校验数据的注解,具体使用哪个注解取决于具体的需求和使用场景。如果需要更加灵活的校验特性,可以选择使用@Validated注解。而@Valid注解则是使用javax.validation提供的校验功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值