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

一、环境集成

  在项目中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. Swift3.0 UICollectionView简单使用

    感觉swift各版本语法改动太大,储备着吧

  2. CF1101A Minimum Integer 模拟

    题意翻译 题意简述 给出qqq组询问,每组询问给出l,r,dl,r,dl,r,d,求一个最小的正整数xxx满足d∣x d | x\ d∣x 且x̸∈[l,r] x \not\in [l,r]x̸∈[l ...

  3. C语言中的常用函数_持续更新

    isspace函数: 背景:之前遇到scanf()输入时会把换行符留在输入队列的情况,如果下次要用到getchar(),但是会导致其先返回这个我们不需要的换行符:从而导致不希望出现的行为: 说明:检查 ...

  4. [AH2017/HNOI2017]礼物(FFT)

    [Luogu3723] [DarkBZOJ4827] 题解 首先,有一个结论:两个手环增加非负整数亮度,等于其中一个增加一个整数亮度(可以为负) 设增加亮度为x.求\(\sum_{i=1}^{n}(a ...

  5. vs快捷键(SharePoint项目)

    1.ctrl+c,alt+c,shift+ctrl+c: ========== Copying to SharePoint Root =========={ProjectRoot}\pkg\Debug ...

  6. 毕业设计 python opencv实现车牌识别 颜色定位

    主要代码参考https://blog.csdn.net/wzh191920/article/details/79589506 GitHub:https://github.com/yinghualuow ...

  7. Lvs Tun隧道模式配置

    ######## TUN是IP Tunneling ,IP隧道的简称,它将调度器收到的IP数据包封装在一个新的IP数据包中,转交给应用服务器,然后实际服务器的返回数据会直接返回给用户. 工作原理: 用 ...

  8. Jenkins自动化CI CD流水线之3--参数化构建

    一. 背景 如果只是简单的构建,jenkins自己默认的插件可以做,但是如果我们想要在构建过程中有更多功能,比如说:选择性构建.传参.项目指定变量等等其他功能,基础的参数化构建可以实现一些简单功能,但 ...

  9. Arm寄存器介绍及汇编基础

    一.ARM处理器支持7种工作模式 ① 用户模式(USR): 用于正常执行程序(The normal ARM program execution state) ② 快速中断模式(FIQ): 用于高速数据 ...

  10. idea(1)-idea初装

    1.安装插件 Alibaba Java Coding Guidelines Free Mybatis plugin MyBatis Log Plugin Lombok pluginGsonFormat ...