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. 自定义异常处理器,捕获错误信息
当验证不通过时会抛异常出来,在全局异常中定义异常处理器。捕获异常信息(因为验证不通过的项可能是多个所以统一捕获处理),并抛给前端。
Spring注解之@validated的使用_第1张图片
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}")

你可能感兴趣的:(JAVA开发技术,java)