JSR303(Bean的校验框架)的注解,在 controller 的方法中验证时(运行时校验属性)使用,如果不合法(校验失败),注解中的提示信息会保存在 result 中。
JSR提供的校验注解:
javax.validation.constraints
注解 | 校验内容 |
---|---|
@Null | 为 null |
@NotNull | 不为 null,可以为空字符串 |
@AssertTrue | 为 true |
@AssertFalse | 为 false |
@Min(value) | 数字,最小值 value |
@Max(value) | 数字,最大值 value |
@DecimalMin(value) | 数字,最小值 value |
@DecimalMax(value) | 数字,最大值 value |
@Size (max=, min=) | 集合,长度范围 min ~ max |
@Digits(integer, fraction) | 数字,在 integer 上下浮动不超过 fraction |
@Past | 过去的日期 |
@Futrue | 将来的日期 |
@Pattern(regex=, flag=) | 符合正则表达式 |
Hibernate Validator 提供的校验注解:
org.hibernate.validator.constraints
注解 | 校验内容 |
---|---|
@NotBlank(message=) | 字符串,非 null,且 trim() 后长度大于0 |
@NotEmpty | 集合,非空 |
电子邮箱地址 | |
@Length(min=, max=) | 字符串,长度范围 min ~ max |
@Range(min=, max=, message=) | 指定范围 min ~ max |
使用 Validate 分组校验
依赖引入。
pom.xml
<!--jsr 303-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<!--hibernate validator-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.0.Final</version>
</dependency>
对校验的属性进行设置和分组。使用了 Validate 提供的校验注解的属性,默认的校验分组是 Default.class。
pojo
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.groups.Default;
@Data
public class UserVo {
// 默认分组是 Default.class。
/**
* 用户新增校验分组(用于新增用户时校验的分组)
*/
public interface AddUser extends Default{
}
/**
* 用户更新校验分组(用于更新用户时校验的分组)
*/
public interface UpdateUser extends Default{
}
@NotNull(message = "用户id不能为空", group = {Add.class, Update.class})
private Long id;
@NotBlank(message = "用户姓名不能为空", group = {Update.class})
private String name;
@NotBlank(message = "用户姓名不能为空", group = {Delete.class})
private String tel;
@DateTimeFormat(pattern = "yyyy-MM-dd")
@Future(message = "只能是将来的日期")
private Date date;
@DecimalMax(value = "10000.0"")
@DecimalMin(value = "1.0"")
private Double doubleValue = null;
@Max(value = 100, message = "最大值")
@Min(value = 1, message = "最小值")
private Integer integer;
@Range(min = 1, max = 100, message = "范围")
private Long range;
@Email(message = "邮箱格式错误")
private String email;
@Size(min = 2, max = 10, message = "字符串长度在2~10")
private String size;
}
controller 方法的参数加上 @Validate 注解后,该方法接收参数时自动对 pojo 中带有验证注解的属性进行相应的校验。不满足验证条件时,进行拦截并返回 message= 定义的信息。
controller
@RestController
@RequestMapping("/validate")
public class TestController {
/**
* 用户登录
* 使用默认分组Default.class进行校验
*/
@RequestMapping("/login")
@ResponseBody
public R add(@RequestBody @Validate UserVo userVo) {
return R.ok("ok");
}
/**
* 新增用户
* 使用一个自建分组Add.class就行校验
*/
@RequestMapping("/add")
@ResponseBody
public R add(@RequestBody @Validate(UserVo.Add.class) UserVo userVo) {
return R.ok("ok");
}
/**
* 更新用户
* 使用一个自建分组Update.class进行校验
*/
@RequestMapping("/update")
@ResponseBody
public R update(@RequestBody @Validate(UserVo.Update.class) UserVo userVo) {
return R.ok("ok");
}
/**
* 删除用户
* 使用多个自建分组Add.class,Delete.class进行校验
*/
@RequestMapping("/delete")
@ResponseBody
public R delete(@RequestBody @Validate(Add.class, Delete.class, Default.class) UserVo userVo) {
return R.ok("ok");
}
}
@Validate 默认校验默认分组 Default.class,校验时可指定多个分组,使用自定义分组时默认分组的校验不在该校验范围内,可添加 Default.class。