在日常开发中经常需要对一些字段进行校验,如字段不能为空、字段长度、日期格式、邮箱格式、出生日期格式等。
这些与业务不相关却不可缺少的逻辑,是件琐碎繁重的工作。幸好,Hibernate Validator提供了一套比较完善的实现方式。
对于 Spring Boot项目而言,spring-boot-starter-web 包已经引入了 Hibernate Validator 的相关jar 包,所以不需要再引入依赖了,可以开箱即用。
两种校验模式
hibernate validator 有两种校验模式:普通模式和快速失败模式。
- 普通模式它会校验所有属性,并返回所有的失败信息
- 快速失败模式则是只有一个校验失败就会返回
在 Spring 环境下我们可以通过编写配置类来实现使用哪种模式,代码 如下:
@Configuration
public class HibernateValidatorConfiguration {
@Bean
public Validator validator(){
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
// 快速失败模式 true表示启用,false表示普通模式
.addProperty("hibernate.validator.fail_fast","true")
.buildValidatorFactory();
return validatorFactory.getValidator();
}
}
POST请求参数的校验
验证POST请求参数,只要在参数前面添加注解 @Valid 即可。
@PostMapping("/getUser")
public ResponseEntity getUser(@RequestBody @Valid UserEntity user);
GET请求参数的校验
要想校验get请求的参数,同样是需要校验Bean。实体类需要作稍微改动,在类上添加 @Component 注解。
@Data
@Component("ValidUser")
public class UserEntity implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "用户ID")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "用户名")
@NotBlank(message = "用户名不能为空")
private String username;
@ApiModelProperty(value = "密码")
@NotBlank(message = "密码不能为空")
@Length(min = 6,max = 20)
private String password;
}
在控制层利用 @ModelAttribute 这个注解进行对象属性赋值,@Valid 对属性进行检查。
@RestController
@RequestMapping("/sys/user-entity")
public class UserController {
@Autowired
private UserServiceImpl userService;
@GetMapping("/getUser")
public ResponseEntity getUser(@ ModelAttribute("ValidUser") @Valid UserEntity user)
}
当发起Get请求时,就会对传入的参数 username 进行校验非空和长度。
http://localhost:8088/sys/user-entity/getUser?username=admin
不过这种方法有个缺陷,就是会对UserEntity中添加了校验注解的所有属性进行校验,所以可以考虑创建一个UserVO对象来用于校验Get请求参数。(暂时还没找到更好的方法)
NotBlank、NotNull、NotEmpty的区别
- @NotEmpty 用在集合类上面
- @NotBlank 用在String上面
- @NotNull 用在基本类型上
常用注解如下:
Constraint | 详细信息 |
---|---|
@Valid | 被注释的元素是一个对象,需要检查此对象的所有字段值 |
@Null | 被注释的元素必须为 null |
@NotNull | 被注释的元素必须不为 null |
@AssertTrue | 被注释的元素必须为 true |
@AssertFalse | 被注释的元素必须为 false |
@Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max, min) | 被注释的元素的大小必须在指定的范围内 |
@Digits (integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 被注释的元素必须是一个过去的日期 |
@Future | 被注释的元素必须是一个将来的日期 |
@Pattern(value) | 被注释的元素必须符合指定的正则表达式 |
被注释的元素必须是电子邮箱地址 | |
@Length | 被注释的字符串的大小必须在指定的范围内 |
@NotEmpty | 被注释的字符串的必须非空 |
@Range | 被注释的元素必须在合适的范围内 |
@NotBlank | 被注释的字符串的必须非空 |
@URL(protocol=,host=, port=,regexp=, flags=) | 被注释的字符串必须是一个有效的url |
@CreditCardNumber | 被注释的字符串必须通过Luhn校验算法,银行卡,信用卡等号码一般都用Luhn计算合法性 |
网友评论