Hibernate数据校验简介
我们在业务中经常会遇到参数校验问题,比如前端参数校验、Kafka消息参数校验等,如果业务逻辑比较复杂,各种实体比较多的时候,我们通过代码对这些数据
一一校验,会出现大量的重复代码以及和主要业务无关的逻辑。Spring MVC提供了参数校验机制,但是其底层还是通过Hibernate进行数据校验,所以有必要去了
解一下Hibernate数据校验和JSR数据校验规范。
1、JSR数据校验规范
Java官方先后发布了JSR303与JSR349提出了数据合法性校验提供的标准框架:BeanValidator,BeanValidator框架中,用户通过在Bean的属性上标注类似于
@NotNull、@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证。
2、JSR注解列表
JSR标准中的数据校验注解如下所示:
注解名 | 注解数据类型 | 注解作用 | 示例 |
---|---|---|---|
AssertFalse | boolean/Boolean | 被注释的元素必须为False | @AssertFalse private boolean success; |
AssertTrue | boolean/Boolean | 被注释的元素必须为True | @AssertTrue private boolean success; |
DecimalMax | BigDecimal/BigInteger/CharSequence/byte/short/int/long及其包装类 | 被注释的值应该小于等于指定的最大值 | @DecimalMax("10") BigDecimal value; |
DecimalMin | BigDecimal/BigInteger/CharSequence/byte/short/int/long及其包装类 | 被注释的值应该大于等于指定的最小值 | @DecimalMin("10") private BigDecimal value; |
Digits | BigDecimal/BigInteger/CharSequence/byte/short/int/long及其包装类 | integer指定整数部分最大位数,fraction指定小数部分最大位数 | @Digits(integer = 10,fraction = 4) private BigDecimal value; |
CharSequence | 字符串为合法的邮箱格式 | @Email private String email; |
|
Future | java中的各种日期类型 | 指定日期应该在当期日期之后 | @Future private LocalDateTime future; |
FutureOrPresent | java中的各种日期类型 | 指定日期应该为当期日期或当期日期之后 | @FutureOrPresent private LocalDateTime futureOrPresent; |
Max | BigDecimal/BigInteger/byte/short/int/long及包装类 | 被注释的值应该小于等于指定的最大值 | @Max("10") private BigDecimal value; |
Min | BigDecimal/BigInteger/byte/short/int/long及包装类 | 被注释的值应该大于等于指定的最小值 | @Min("10") private BigDecimal value; |
Negative | BigDecimal/BigInteger/byte/short/int/long/float/double及包装类 | 被注释的值应该是负数 | @Negative private BigDecimal value; |
NegativeOrZero | BigDecimal/BigInteger/byte/short/int/long/float/double及包装类 | 被注释的值应该是0或者负数 | @NegativeOrZero private BigDecimal value; |
NotBlank | CharSequence | 被注释的字符串至少包含一个非空字符 | @NotBlank private String noBlankString; |
NotEmpty | CharSequence/Collection/Map/Array | 被注释的集合元素个数大于0 | @NotEmpty private List<string> values; |
NotNull | any | 被注释的值不为空 | @NotEmpty private Object value; |
Null | any | 被注释的值必须空 | @Null private Object value; |
Past | java中的各种日期类型 | 指定日期应该在当期日期之前 | @Past private LocalDateTime past; |
PastOrPresent | java中的各种日期类型 | 指定日期应该在当期日期或之前 | @PastOrPresent private LocalDateTime pastOrPresent; |
Pattern | CharSequence | 被注释的字符串应该符合给定得到正则表达式 | @Pattern(\d*) private String numbers; |
Positive | BigDecimal/BigInteger/byte/short/int/long/float/double及包装类 | 被注释的值应该是正数 | @Positive private BigDecimal value; |
PositiveOrZero | BigDecimal/BigInteger/byte/short/int/long/float/double及包装类 | 被注释的值应该是正数或0 | @PositiveOrZero private BigDecimal value; |
Size | CharSequence/Collection/Map/Array | 被注释的集合元素个数在指定范围内 | @Size(min=1,max=10) private List<string> values; |
3、Hibernate数据校验
基于JSR数据校验规范,Hibernate添加了一些新的注解校验,然后实现了JSR的Validator
接口用于数据校验。
@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(regex=,flag=) 被注释的元素必须符合指定的正则表达式 * Hibernate Validator 附加的 constraint
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
4、SpringMVC整合hibernate-validator后端数据校验
1、导入依赖
<!--hibernate-validator-后台校验-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!--hibernate-validator-后台校验-->
2、在springmvc.xml配置文件中配置相关信息
<!-- hibernate-validator数据检验-->
<!-- 注册验证器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
</bean>
3、实体类标注
@Data
public class User {
@NotBlank
@Size(max=64)
private String name;
@Min(0)
@Max(200)
private int age;
/* @Range(min = 1, max = 150)
private Integer age;
@NotEmpty
private String name;*/
@Length(min = 4, max = 20, message = "用户名只能在4~20位之间")
private String username;
@Length(min = 4, max = 20, message = "密码只能在4~20位之间")
private String password;
@Pattern(regexp = "^1[35678]\\d{9}$", message = "手机号格式不正确")
private String phone;
}
4、controller应用
@RequestMapping("/update")
public R update(@RequestBody @Valid Book book, BindingResult result){
String str="";
if(result.hasErrors()){
for (ObjectError error : result.getAllErrors()) {
str+=error.getDefaultMessage();
}
R r = new R(Code.UPDATE_ERR, "修改失败", str);
return r;
}
int res= bookService.editBook(book);
if(res>0) {
R r = new R(Code.UPDATE_OK, "修改成功", null);
return r;
}else{
R r = new R(Code.UPDATE_ERR, "修改失败", null);
return r;
}
}
标签:Hibernate,BigDecimal,int,简介,校验,private,注释,value
From: https://www.cnblogs.com/YxinHaaa/p/17476569.html