废话不多说,直接开始集成环境。

一、环境集成

  在项目中hibernate-Validator包在spring-boot-starter-web包里面有,不需要重复引用 。(整个Demo都是用PostMan软件进行数据传输。

二、Demo实例

  此Mode中添加了些简单、常用的Validator注解

 import com.shida.api.baseData.validatorUtils.IsMobile;
import org.hibernate.validator.constraints.Length;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.io.Serializable; public class AccountVO implements Serializable { /**
* 手机号
*/
@IsMobile
private String account; /**
* 密码
*/
@NotNull
@Length(min = 1 , max = 6 , message = "密码不能为空且长度需要在1和6之间")
private String password; /**
* 账户状态
*/
@NotNull(message = "账号状态不能为空")
private Integer status; /**
* 账户扩展信息
*/
@Valid
private UserInfoVO userInfoVO; public String getAccount() {return account;} public void setAccount(String account) {this.account = account;} public String getPassword() {return password;} public void setPassword(String password) {this.password = password;} public Integer getStatus() {return status;} public void setStatus(Integer status) { this.status = status;} public UserInfoVO getUserInfoVO() {return userInfoVO;} public void setUserInfoVO(UserInfoVO userInfoVO) {this.userInfoVO = userInfoVO;}
}

接下来Post接口验证,Controller中调用DemoVO验证集合校验情况:

 package com.shida.account.center.controller;

 import com.base.data.common.message.MessageVo;
import com.base.data.common.message.StatusCode;
import com.shida.account.center.service.IAccountService;
import com.shida.api.baseData.model.AccountVO;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource;
import javax.validation.Valid; @RestController
@Validated
@RequestMapping("/data/account")
public class AccountController { @Resource
private IAccountService accountService; /**
* 添加账户
* @param accountVO
* @return
*/
@PostMapping(value = "/add")
public MessageVo addAccount(@Valid @RequestBody AccountVO accountVO){
MessageVo message = new MessageVo();
accountService.addAccount(accountVO);
message.setCode(StatusCode.success);
message.setMsg("账户添加成功");
message.setResult(accountVO);
return message;
}
}

PostMan请求入参:

PostMan返回结果:(MessageVo是我自己写的一个返回Mode,用于承载返回结果。)

{
"code": "204",
"msg": "前后端校验发生异常+[accountVO.account:手机号码错误][accountVO.password:密码不能为空][accountVO.status:账号状态不能为空]",
"result": null
}

注:如果实体类想参与校验则需要在实体类前加@Valid注解。不加则不参与校验。

三、对象级联校验填坑。

1、对象级联校验方式。

  对象级联校验Mode为对象内部包含另一个对象最为属性。内部对象也需要加入@Valid注解。则开启内部对象校验。(如果用PostMan作为自测接口方式,需要另加@RequestBody注解,RequestBody会自动将参数分配到各个Type中。否则会报错。)

  集合类的入参同样也需要用@RequestBody注解。  

  controller实例:

   public MessageVo addAccount(@Valid @RequestBody AccountVO accountVO){
MessageVo message = new MessageVo();
return message;
}

  Mode实例:

 public class AccountVO implements Serializable {

     @IsMobile
private String account; @Valid
private UserInfoVO userInfoVO; }

  UserInfoVO实例:

 public class UserInfoVO implements Serializable {

     @NotNull
private Integer sex; }

  PostMan校验结果:

四、自定义校验器

  一般情况,自定义验证可以解决很多问题。但也有无法满足情况的时候,此时,我们可以实现validator的接口,自定义自己需要的验证器。如下所示,实现了一个自定义的大小写验证器:

 public enum CaseMode {
UPPER,
LOWER;
} @Target( { ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = CheckCaseValidator.class)
@Documented
public @interface CheckCase {
String message() default ""; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; CaseMode value();
} public class CheckCaseValidator implements ConstraintValidator<CheckCase, String> {
private CaseMode caseMode;
public void initialize(CheckCase checkCase) {
this.caseMode = checkCase.value();
} public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
if (s == null) {
return true;
} if (caseMode == CaseMode.UPPER) {
return s.equals(s.toUpperCase());
} else {
return s.equals(s.toLowerCase());
}
}
}

要验证的Model:

     public class Demo{
@CheckCase(value = CaseMode.LOWER,message = "userName必须是小写")
private String userName; public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
}
}

validator配置:

     @Bean
public Validator validator(){
ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
.configure()
.addProperty( "hibernate.validator.fail_fast", "true" )
.buildValidatorFactory();
Validator validator = validatorFactory.getValidator(); return validator;
}

验证测试:

     @RequestMapping("/demo4")
public void demo4(){
Demo demo = new Demo();
demo.setUserName("userName");
Set<ConstraintViolation<Demo>> validate = validator.validate(demo);
for (ConstraintViolation<Demo> dem : validate) {
System.out.println(dem.getMessage());
}
}

输出结果:

   userName必须是小写

五、常见注解。

  

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

六、参考资料  

https://www.cnblogs.com/mr-yang-localhost/p/7812038.html#_label5

Spring Boot集成Hibernate Validator的更多相关文章

  1. 【实验一 】Spring Boot 集成 hibernate & JPA

    转眼间,2018年的十二分之一都快过完了,忙于各类事情,博客也都快一个月没更新了.今天我们继续来学习Springboot对象持久化. 首先JPA是Java持久化API,定义了一系列对象持久化的标准,而 ...

  2. Spring Boot 整合Hibernate Validator

    Spring Boot 整合Hibernate Validator 依赖 <dependencies> <dependency> <groupId>org.spri ...

  3. spring boot 使用hibernate validator 验证service

    不在controller中验证,而是在service中验证. spring boot 默认使用的就是hibernate validator,存在于pom的spring-boot-starter-web ...

  4. 81. Spring Boot集成JSP疑问【从零开始学Spring Boot】

    [原创文章,转载请注明出处] 针对文章: ()Spring Boot 添加JSP支持[从零开始学Spring Boot] 有网友提了这么一些疑问: 1.Spring Boot使用jsp时,仍旧可以打成 ...

  5. Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题

      (转载)Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题   这几天在用spring boot开发项目, 在开发的过程中遇到一个问题hibernate在执 ...

  6. Spring Boot集成JPA的Column注解命名字段无效的问题

    偶然发现,Spring Boot集成jpa编写实体类的时候,默认使用的命名策略是下划线分隔的字段命名. Spring Boot版本:1.5.4.release 数据表: id int, userNam ...

  7. (37)Spring Boot集成EHCache实现缓存机制【从零开始学Spring Boot】

    [本文章是否对你有用以及是否有好的建议,请留言] 写后感:博主写这么一系列文章也不容易啊,请评论支持下. 如果看过我之前(35)的文章这一篇的文章就会很简单,没有什么挑战性了. 那么我们先说说这一篇文 ...

  8. (35)Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】

    [本文章是否对你有用以及是否有好的建议,请留言] 本文章牵涉到的技术点比较多:Spring Data JPA.Redis.Spring MVC,Spirng Cache,所以在看这篇文章的时候,需要对 ...

  9. SpringBoot系列:Spring Boot集成Spring Cache,使用EhCache

    前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache.RedisCache.ConcurrentMapCac ...

随机推荐

  1. Mouse Hunt

    Mouse Hunt 给定一个n个点的图,每个点有权值\(c_i\),并且只有一条出边.现在你要在一些点上打标记,使得从任何一个点出发最终都会经过有标记的点.求标记点的权值和最小值. 就是找环啊!拓扑 ...

  2. 【BZOJ 3326】[Scoi2013]数数

    题目描述 Fish 是一条生活在海里的鱼,有一天他很无聊,就开始数数玩.他数数玩的具体规则是: 确定数数的进制B 确定一个数数的区间[L, R] 对于[L, R] 间的每一个数,把该数视为一个字符串, ...

  3. MVC与三层的区别

    闲来无事,想了想MVC与三层的区别,根据自己的经验,上图 由此来看,其实这两种框架(结构)的分层方式其实没什么联系,也没有什么可比性,但他们的目的都一样的:解耦 --Ones

  4. CF959E Mahmoud and Ehab and the xor-MST 思维

    Ehab is interested in the bitwise-xor operation and the special graphs. Mahmoud gave him a problem t ...

  5. appium键盘处理

    最近对appium感兴趣,就从网上找了些资料,搭建了环境,下载了appium测试代码和测试apk,这方面的东西晚上再写 appium最新版(v1.4.0.0)已经没有sendKeyEvent了,所以现 ...

  6. JavaScript Succinctly 读后笔记

    1.JavaScript does not have block scope  2.Scope is determined during function definintion,  not invo ...

  7. P3943 星空

    传送门 观察题目数据,发现 k ≤ 8 ,可能可以从这里入手解决问题 考虑状态压缩 但是我们每次操作都会让一连串的序列改变,而序列的每个状态都是必须要知道的 很麻烦,所以考虑如何把一段区间表示地简单一 ...

  8. Ubuntu14.04配置python接口,测试的小问题

    当遇到“ImportError:No module named google.protobuf.internal”(import enum_type_wrapper)的问题时候 solution: P ...

  9. my11_mysql事务隔离

    概述 ************************************************ Mysql有四个事务隔离级别,默认隔离级别为RR,开启一个事务可以使用 START TRANSA ...

  10. .NET接收邮件下载邮件附件——openpop.net

    使用OpenPop.Net接收邮件很方便,下面是接收下载邮件附件的代码 OpenPop.Net下载地址 https://sourceforge.net/projects/hpop/ public cl ...