Hibernate Validator是Hibernate提供的一个开源框架,使用注解方式非常方便的实现服务端的数据校验。
官网:http://hibernate.org/validator/
Bean校验的注解
常用注解如下:
注意,导入的包
import javax.persistence.*;
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计算合法性 |
使用
1.pom
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
2.实体类上加注解
@Table(name = "tb_user")
@Data
public class User {
@Id
@KeySql(useGeneratedKeys = true)
private Long id;
@Pattern(regexp = RegexPatterns.USERNAME_REGEX, message = "用户名格式不正确")
private String username;
@Length(min = 4, max = 30, message = "密码格式不正确")
private String password;
@Pattern(regexp = RegexPatterns.PHONE_REGEX, message = "手机号格式不正确")
private String phone;
private Date createTime;
private Date updateTime;
}
3.控制器
在controller中只需要给User添加 @Valid注解即可。
4.可以自定义返回结果
默认是返回这样的错误信息
自定义:
我们在User参数后面跟一个BindingResult参数,不管校验是否通过,都会进入方法内部。如何判断校验是否通过呢?
BindingResult中会封装错误结果,我们通过result.hashErrors来判断是否有错误,然后荣光result.getFieldErrors来获取错误信息。
/**
* 注册用户
* @param user
* @param code
* @return
*/
@PostMapping("/register")
public ResponseEntity<Void> register(@Valid User user,
BindingResult result,//此对象要紧挨着需要被校验的对象
@RequestParam("code") String code){
if(result.hasErrors()){
//收集异常信息
String errorStr = result.getFieldErrors()
.stream()
.map(FieldError::getDefaultMessage)
.collect(Collectors.joining("|"));
//抛出获取异常信息
throw new LyException(400, errorStr);
}
userService.register(user, code);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
再次测试: