关闭页面特效

Hibernate数据校验简介

1|0Hibernate数据校验简介


我们在业务中经常会遇到参数校验问题,比如前端参数校验、Kafka消息参数校验等,如果业务逻辑比较复杂,各种实体比较多的时候,我们通过代码对这些数据

一一校验,会出现大量的重复代码以及和主要业务无关的逻辑。Spring MVC提供了参数校验机制,但是其底层还是通过Hibernate进行数据校验,所以有必要去了

解一下Hibernate数据校验和JSR数据校验规范。

JSR数据校验规范

Java官方先后发布了JSR303与JSR349提出了数据合法性校验提供的标准框架:BeanValidator,BeanValidator框架中,用户通过在Bean的属性上标注类似于

@NotNull、@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证。

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;
Email 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;

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=) 被注释的元素必须在合适的范围内

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; } }

__EOF__

作  者YXH
出  处https://www.cnblogs.com/YxinHaaa/p/17476569.html
关于博主:编程路上的小学生,热爱技术,喜欢专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!

posted @   YxinHaaa  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
0
0
关注
跳至底部
点击右上角即可分享
微信分享提示