springboot使用hibernate validator校验方式

一、参数校验

在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有两个麻烦:

  • 验证代码繁琐,重复劳动
  • 方法内代码显得冗长
  • 每次要看哪些参数验证是否完整,需要去翻阅验证逻辑代码

hibernate validator(官方文档)提供了一套比较完善、便捷的验证实现方式。

spring-boot-starter-web包里面有hibernate-validator包,不需要引用hibernate validator依赖。

二、hibernate validator校验demo

先来看一个简单的demo,添加了Validator的注解:

import org.hibernate.validator.constraints.NotBlank;
import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.Pattern;
@Getter
@Setter
@NoArgsConstructor
public class DemoModel {
 @NotBlank(message="用户名不能为空")
 private String userName;
 @NotBlank(message="年龄不能为空")
 @Pattern(regexp="^[0-9]{1,2}$",message="年龄不正确")
 private String age;
 @AssertFalse(message = "必须为false")
 private Boolean isFalse;
 /**
 * 如果是空,则不校验,如果不为空,则校验
 */
 @Pattern(regexp="^[0-9]{4}-[0-9]{2}-[0-9]{2}$",message="出生日期格式不正确")
 private String birthday;
}

POST接口验证,BindingResult是验证不通过的结果集合:

 @RequestMapping("/demo2")
 public void demo2(@RequestBody @Valid DemoModel demo, BindingResult result){
 if(result.hasErrors()){
  for (ObjectError error : result.getAllErrors()) {
  System.out.println(error.getDefaultMessage());
  }
 }
 }

POST请求传入的参数:{"userName":"dd","age":120,"isFalse":true,"birthday":"21010-21-12"}

输出结果:

出生日期格式不正确
必须为false
年龄不正确

参数验证非常方便,字段上注解+验证不通过提示信息即可代替手写一大堆的非空和字段限制验证代码。下面深入了解下参数校验的玩法。

三、hibernate的校验模式

细心的读者肯定发现了:上面例子中一次性返回了所有验证不通过的集合,通常按顺序验证到第一个字段不符合验证要求时,就可以直接拒绝请求了。Hibernate Validator有以下两种验证模式:

1、普通模式(默认是这个模式)

  普通模式(会校验完所有的属性,然后返回所有的验证失败信息)

2、快速失败返回模式

  快速失败返回模式(只要有一个验证失败,则返回)

两种验证模式配置方式:(参考官方文档

failFast:true  快速失败返回模式    false 普通模式

ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
 .configure()
 .failFast( true )
 .buildValidatorFactory();
Validator validator = validatorFactory.getValidator();

和 (hibernate.validator.fail_fast:true  快速失败返回模式    false 普通模式)

ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
 .configure()
 .addProperty( "hibernate.validator.fail_fast", "true" )
 .buildValidatorFactory();
Validator validator = validatorFactory.getValidator();

四、hibernate的两种校验

配置hibernate Validator为快速失败返回模式:

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

1、请求参数校验

如demo里示例的,验证请求参数时,在@RequestBody DemoModel demo之间加注解 @Valid,然后后面加BindindResult即可;多个参数的,可以加多个@Valid和BindingResult,如:

public void test()(@RequestBody @Valid DemoModel demo, BindingResult result)
public void test()(@RequestBody @Valid DemoModel demo, BindingResult result,@RequestBody @Valid DemoModel demo2, BindingResult result2)
 @RequestMapping("/demo2")
 public void demo2(@RequestBody @Valid DemoModel demo, BindingResult result){
 if(result.hasErrors()){
  for (ObjectError error : result.getAllErrors()) {
  System.out.println(error.getDefaultMessage());
  }
 }
 }

2、GET参数校验(@RequestParam参数校验)

使用校验bean的方式,没有办法校验RequestParam的内容,一般在处理Get请求(或参数比较少)的时候,会使用下面这样的代码:

 @RequestMapping(value = "/demo3", method = RequestMethod.GET)
 public void demo3(@RequestParam(name = "grade", required = true) int grade,@RequestParam(name = "classroom", required = true) int classroom) {
 System.out.println(grade + "," + classroom);
 }

使用@Valid注解,对RequestParam对应的参数进行注解,是无效的,需要使用@Validated注解来使得验证生效。如下所示:

a.此时需要使用MethodValidationPostProcessor 的Bean:

 @Bean
 public MethodValidationPostProcessor methodValidationPostProcessor() {
     /**默认是普通模式,会返回所有的验证不通过信息集合*/
 return new MethodValidationPostProcessor();
 }

或 可对MethodValidationPostProcessor 进行设置Validator(因为此时不是用的Validator进行验证,Validator的配置不起作用)

@Bean
 public MethodValidationPostProcessor methodValidationPostProcessor() {
 MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
     /**设置validator模式为快速失败返回*/
 postProcessor.setValidator(validator());
 return postProcessor;
 }
 @Bean
 public Validator validator(){
 ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
  .configure()
  .addProperty( "hibernate.validator.fail_fast", "true" )
  .buildValidatorFactory();
 Validator validator = validatorFactory.getValidator();
 return validator;
 }

b.方法所在的Controller上加注解@Validated

@RequestMapping("/validation")
@RestController
@Validated
public class ValidationController {
 /**如果只有少数对象,直接把参数写到Controller层,然后在Controller层进行验证就可以了。*/
 @RequestMapping(value = "/demo3", method = RequestMethod.GET)
 public void demo3(@Range(min = 1, max = 9, message = "年级只能从1-9")
   @RequestParam(name = "grade", required = true)
   int grade,
   @Min(value = 1, message = "班级最小只能1")
   @Max(value = 99, message = "班级最大只能99")
   @RequestParam(name = "classroom", required = true)
   int classroom) {
 System.out.println(grade + "," + classroom);
 }
}

c.返回验证信息提示

可以看到:验证不通过时,抛出了ConstraintViolationException异常,使用同一捕获异常处理:

@ControllerAdvice
@Component
public class GlobalExceptionHandler {
 @ExceptionHandler
 @ResponseBody
 @ResponseStatus(HttpStatus.BAD_REQUEST)
 public String handle(ValidationException exception) {
 if(exception instanceof ConstraintViolationException){
  ConstraintViolationException exs = (ConstraintViolationException) exception;
  Set<ConstraintViolation<?>> violations = exs.getConstraintViolations();
  for (ConstraintViolation<?> item : violations) {
          /**打印验证不通过的信息*/
  System.out.println(item.getMessage());
  }
 }
 return "bad request, " ;
 }
}

d.验证

浏览器服务请求地址:http://localhost:8080/validation/demo3?grade=18&classroom=888

没有配置快速失败返回的MethodValidationPostProcessor 时输出信息如下:

年级只能从1-9
班级最大只能99

配置了快速失败返回的MethodValidationPostProcessor 时输出信息如下:

年级只能从1-9

浏览器服务请求地址:http://localhost:8080/validation/demo3?grade=0&classroom=0

没有配置快速失败返回的MethodValidationPostProcessor 时输出信息如下:

年级只能从1-9
班级最小只能1

配置了快速失败返回的MethodValidationPostProcessor 时输出信息如下:

年级只能从1-9

3、model校验

待校验的model:

@Data
public class Demo2 {
 @Length(min = 5, max = 17, message = "length长度在[5,17]之间")
 private String length;
 /**@Size不能验证Integer,适用于String, Collection, Map and arrays*/
 @Size(min = 1, max = 3, message = "size在[1,3]之间")
 private String age;
 @Range(min = 150, max = 250, message = "range在[150,250]之间")
 private int high;
 @Size(min = 3,max = 5,message = "list的Size在[3,5]")
 private List<String> list;
}

验证model,以下全部验证通过:

 @Autowired
 private Validator validator;
 @RequestMapping("/demo3")
 public void demo3(){
 Demo2 demo2 = new Demo2();
 demo2.setAge("111");
 demo2.setHigh(150);
 demo2.setLength("ABCDE");
 demo2.setList(new ArrayList<String>(){{add("111");add("222");add("333");}});
 Set<ConstraintViolation<Demo2>> violationSet = validator.validate(demo2);
 for (ConstraintViolation<Demo2> model : violationSet) {
  System.out.println(model.getMessage());
 }
 }

4、对象级联校验

对象内部包含另一个对象作为属性,属性上加@Valid,可以验证作为属性的对象内部的验证:(验证Demo2示例时,可以验证Demo2的字段)

@Data
public class Demo2 {
 @Size(min = 3,max = 5,message = "list的Size在[3,5]")
 private List<String> list;
 @NotNull
 @Valid
 private Demo3 demo3;
}
@Data
public class Demo3 {
 @Length(min = 5, max = 17, message = "length长度在[5,17]之间")
 private String extField;
}

级联校验:

 /**前面配置了快速失败返回的Bean*/
 @Autowired
 private Validator validator;
 @RequestMapping("/demo3")
 public void demo3(){
 Demo2 demo2 = new Demo2();
 demo2.setList(new ArrayList<String>(){{add("111");add("222");add("333");}});
 Demo3 demo3 = new Demo3();
 demo3.setExtField("22");
 demo2.setDemo3(demo3);
 Set<ConstraintViolation<Demo2>> violationSet = validator.validate(demo2);
 for (ConstraintViolation<Demo2> model : violationSet) {
  System.out.println(model.getMessage());
 }
 }

可以校验Demo3的extField字段。

5、分组校验

结论:分组顺序校验时,按指定的分组先后顺序进行验证,前面的验证不通过,后面的分组就不行验证。

有这样一种场景,新增用户信息的时候,不需要验证userId(因为系统生成);修改的时候需要验证userId,这时候可用用户到validator的分组验证功能。

设置validator为普通验证模式("hibernate.validator.fail_fast", "false"),用到的验证GroupA、GroupB和model:

GroupA、GroupB:
public interface GroupA {
}
public interface GroupB {
}

验证model:Person

@Data
public class Person {
 @NotBlank
 @Range(min = 1,max = Integer.MAX_VALUE,message = "必须大于0",groups = {GroupA.class})
 /**用户id*/
 private Integer userId;
 @NotBlank
 @Length(min = 4,max = 20,message = "必须在[4,20]",groups = {GroupB.class})
 /**用户名*/
 private String userName;
 @NotBlank
 @Range(min = 0,max = 100,message = "年龄必须在[0,100]",groups={Default.class})
 /**年龄*/
 private Integer age;
 @Range(min = 0,max = 2,message = "性别必须在[0,2]",groups = {GroupB.class})
 /**性别 0:未知;1:男;2:女*/
 private Integer sex;
}

如上Person所示,3个分组分别验证字段如下:

  • GroupA验证字段userId;
  • GroupB验证字段userName、sex;
  • Default验证字段age(Default是Validator自带的默认分组)

a、分组

只验证GroupA、GroupB标记的分组:

@RequestMapping("/demo5")
public void demo5(){
 Person p = new Person();
 /**GroupA验证不通过*/
 p.setUserId(-12);
 /**GroupA验证通过*/
 //p.setUserId(12);
 p.setUserName("a");
 p.setAge(110);
 p.setSex(5);
 Set<ConstraintViolation<Person>> validate = validator.validate(p, GroupA.class, GroupB.class);
 for (ConstraintViolation<Person> item : validate) {
 System.out.println(item);
 }
}

 @RequestMapping("/demo6")
 public void demo6(@Validated({GroupA.class, GroupB.class}) Person p, BindingResult result){
 if(result.hasErrors()){
  List<ObjectError> allErrors = result.getAllErrors();
  for (ObjectError error : allErrors) {
  System.out.println(error);
  }
 }
 }

GroupA、GroupB、Default都验证不通过的情况:

验证信息如下所示:

ConstraintViolationImpl{interpolatedMessage='必须在[4,20]', propertyPath=userName, rootBeanClass=class validator.demo.project.model.Person, messageTemplate='必须在[4,20]'}
ConstraintViolationImpl{interpolatedMessage='必须大于0', propertyPath=userId, rootBeanClass=class validator.demo.project.model.Person, messageTemplate='必须大于0'}
ConstraintViolationImpl{interpolatedMessage='性别必须在[0,2]', propertyPath=sex, rootBeanClass=class validator.demo.project.model.Person, messageTemplate='性别必须在[0,2]'}

GroupA验证通过、GroupB、Default验证不通过的情况:

验证信息如下所示:

ConstraintViolationImpl{interpolatedMessage='必须在[4,20]', propertyPath=userName, rootBeanClass=class validator.demo.project.model.Person, messageTemplate='必须在[4,20]'}
ConstraintViolationImpl{interpolatedMessage='性别必须在[0,2]', propertyPath=sex, rootBeanClass=class validator.demo.project.model.Person, messageTemplate='性别必须在[0,2]'}

b、组序列

除了按组指定是否验证之外,还可以指定组的验证顺序,前面组验证不通过的,后面组不进行验证:

指定组的序列(GroupA》GroupB》Default):

@GroupSequence({GroupA.class, GroupB.class, Default.class})
public interface GroupOrder {
}

测试demo:

 @RequestMapping("/demo7")
 public void demo7(){
 Person p = new Person();
 /**GroupA验证不通过*/
 //p.setUserId(-12);
 /**GroupA验证通过*/
 p.setUserId(12);
 p.setUserName("a");
 p.setAge(110);
 p.setSex(5);
 Set<ConstraintViolation<Person>> validate = validator.validate(p, GroupOrder.class);
 for (ConstraintViolation<Person> item : validate) {
  System.out.println(item);
 }
 }

 @RequestMapping("/demo8")
 public void demo8(@Validated({GroupOrder.class}) Person p, BindingResult result){
 if(result.hasErrors()){
  List<ObjectError> allErrors = result.getAllErrors();
  for (ObjectError error : allErrors) {
  System.out.println(error);
  }
 }
 }

GroupA、GroupB、Default都验证不通过的情况:

验证信息如下所示:

ConstraintViolationImpl{interpolatedMessage='必须大于0', propertyPath=userId, rootBeanClass=class validator.demo.project.model.Person, messageTemplate='必须大于0'}

GroupA验证通过、GroupB、Default验证不通过的情况:

验证信息如下所示:

ConstraintViolationImpl{interpolatedMessage='必须在[4,20]', propertyPath=userName, rootBeanClass=class validator.demo.project.model.Person, messageTemplate='必须在[4,20]'}
ConstraintViolationImpl{interpolatedMessage='性别必须在[0,2]', propertyPath=sex, rootBeanClass=class validator.demo.project.model.Person, messageTemplate='性别必须在[0,2]'}

结论:分组顺序校验时,按指定的分组先后顺序进行验证,前面的验证不通过,后面的分组就不行验证。

五、自定义验证器

一般情况,自定义验证可以解决很多问题。但也有无法满足情况的时候,此时,我们可以实现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=) 被注释的元素必须在合适的范围内
//大于0.01,不包含0.01
@NotNull
@DecimalMin(value = "0.01", inclusive = false)
private Integer greaterThan;
//大于等于0.01
@NotNull
@DecimalMin(value = "0.01", inclusive = true)
private BigDecimal greatOrEqualThan;
@Length(min = 1, max = 20, message = "message不能为空")
//不能将Length错用成Range
//@Range(min = 1, max = 20, message = "message不能为空")
private String message;

七、参考资料

参考资料:

http://docs.jboss.org/hibernate/validator/4.2/reference/zh-CN/html_single/#validator-gettingstarted

您可能感兴趣的文章:

  • spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
  • 轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
  • 基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(详解)
  • 详解spring boot集成ehcache 2.x 用于hibernate二级缓存
  • Spring Boot + Jpa(Hibernate) 架构基本配置详解
(0)

相关推荐

  • Spring Boot + Jpa(Hibernate) 架构基本配置详解

    1.基于springboot-1.4.0.RELEASE版本测试 2.springBoot + hibernate + Druid + MySQL + servlet(jsp) 不废话,直接上代码 一.maven的pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&qu

  • 详解spring boot集成ehcache 2.x 用于hibernate二级缓存

    本文将介绍如何在spring boot中集成ehcache作为hibernate的二级缓存.各个框架版本如下 spring boot:1.4.3.RELEASE spring framework: 4.3.5.RELEASE hibernate:5.0.1.Final(spring-boot-starter-data-jpa默认依赖) ehcache:2.10.3 项目依赖 <dependency> <groupId>org.springframework.boot</gro

  • 基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(详解)

    1.pom添加依赖 <!-- spring data jpa,会注入tomcat jdbc pool/hibernate等 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <

  • 轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)

    还是那句老话,好记性不如烂笔头.记得以前的一个Demo项目里面有分页,但是没有用插件,自己手写的分页处理,但是效果并不是很好,最近接触到插件BootstrapTable,风格和Bootstrap统一,现在就来说说怎样使用它. 初上手,直接套json数据进去,然后设置分页方式为client',很快表格就做出来,但是一般项目中都是使用后台来进行分页的,不可能一下从数据库从捞出成千上万条数据,先不说流量的问题,客户端的渲染也吃力.在使用服务器后端分页的过程中,也遇到了一些问题,相信大部分初次接触Boo

  • spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)

    创建项目 使用IDEA创建一个spring-boot项目,依赖选上 web, validation, freemarker 即可 先看看效果 创建实体类 创建并加上注解,代码如下 public class Person implements Serializable { @NotNull @Length(min = 3, max = 10) // username长度在3-10之间 private String username; @NotNull @Min(18) // 年龄最小要18岁 pr

  • springboot使用hibernate validator校验方式

    一.参数校验 在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有两个麻烦: 验证代码繁琐,重复劳动 方法内代码显得冗长 每次要看哪些参数验证是否完整,需要去翻阅验证逻辑代码 hibernate validator(官方文档)提供了一套比较完善.便捷的验证实现方式. spring-boot-starter-web包里面有hibernate-validator包,不需要引用hibernate validator依赖. 二.hi

  • SpringBoot 使用hibernate validator校验

    本文将全面的介绍如何使用 validator 进行数据校验 本文源码: https://gitee.com/yintianwen7/taven-springboot-learning/tree/master/springboot-validate 准备工作 我们只需要引入 spring-boot-starter-web 包即可使用 1.常用注解 常用注解 2.简单的实体校验 public class CardDTO { @NotBlank private String cardId; @Size

  • springboot使用Validator校验方式

    我相信每个做开发的都听过这句"永远不要相信用户的输入",因此后台需要对用户的每个输入项都做校验:手机号.用户名.密码.邮箱.身份证号······这时候就需要hibernate-Validator校验框架登场了,下面介绍springboot如何使用hibernate-Validator进行校验. 引入pom WAIT ~~~ starter-web的依赖 惊不惊喜,意不意外?springboot已帮我们集成了,我们只管拿!来!用! 添加注解 @NotBlank(message = &qu

  • SpringBoot整合Hibernate Validator实现参数验证功能

    在前后端分离的开发模式中,后端对前端传入的参数的校验成了必不可少的一个环节.但是在多参数的情况下,在controller层加上参数验证,会显得特别臃肿,并且会有许多的重复代码.这里可以引用Hibernate Validator来解决这个问题,直接在实体类进行参数校验,验证失败直接返回错误信息给前端,减少controller层的代码量. 一.xml引入Hibernate Validator <!-- 验证器 --> <dependency> <groupId>org.hi

  • Hibernate Validator实现更简洁的参数校验及一个util

    代码地址 https://github.com/wheel-organization/wheel 简介 hibernate-validator是Hibernate项目中的一个数据校验框架,是Bean Validation 的参考实现,hibernate-validator除了提供了JSR 303规范中所有内置constraint 的实现,还有一些附加的constraint. 使用hibernate-validator能够将数据校验从业务代码中脱离出来,增加代码可读性,同时也让数据校验变得更加方便

  • SpringBoot 中使用 Validation 校验参数的方法详解

    目录 1. Validation 介绍 1.1 Validation 注解 1.2 @valid 和 @validated的区别 2. SpringBoot 中使用 Validator 校验参数 2.1 依赖引入 2.2 标注校验实体类 2.3 开启参数校验 2.3.1 简单参数校验 2.3.2 JavaBean 校验 2.4 捕捉参数校验异常 项目中写逻辑时,为保证程序的健壮性,需要对各种参数进行判断,这就导致业务代码不只健壮,还十分臃肿.其实 SpringBoot 中已经提供了 Valida

  • springboot使用hibernate validation对参数校验的实现方法

    springboot天生支持使用hibernate validation对参数的优雅校验,如果不使用它,只能对参数挨个进行如下方式的手工校验,不仅难看,使用起来还很不方便: if(StringUtils.isEmpty(userName)){ throw new RuntimeException("用户名不能为空"); } 下面将介绍hibernate validation的基本使用方法. 一.引入依赖 这里在springboot 2.4.1中进行实验,引入以下依赖: <pare

  • springboot表单提交之validator校验

    前言 表单提交是最常见的数据提交方式,我们经常会填写表单信息,比如用户名,身份证,手机号等等,因此就会产生身份证是否合法,用户名是否为空,虽然我们可以直接在前台使用js就进行格式的校验,但如果使用postman工具直接发请求呢?使用我们后端也需要进行对数据的校验,这样极大的确保数据的安全性和合法性. 1.新建一个Springboot项目,并且添加web依赖.下面是本项目的全部依赖 <dependencies> <dependency> <groupId>org.spri

  • Hibernate validator使用以及自定义校验器注解

    JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,用于对 Java Bean 中的字段的值进行验证.Hibernate Validator则是Hibdernate提供的一种对该规范的实现. --即Hibernate Validator是用来做参数校验. 使用Hibernate Validator提供的注解进行参数校验 注解 释义 @Null 必须为null @NotNull 不能为null @AssertTrue 必须为true @AssertFals

  • java开发之基于Validator接口的SpringMVC数据校验方式

    Spring MVC 提供了两种数据校验的方式: 1.基于 Validator 接口. 2.使用 Annotation JSR - 303 标准进行校验. 基于 Validator 接口的⽅式需要自定义 Validator 验证器,每⼀条数据的验证规则需要开发者⼿动完成, 使⽤ Annotation JSR - 303 标准则不需要⾃定义验证器,通过注解的方式可以直接在实体类中添加每个属性的验证规则,这种方式更加方便,实际开发中推荐使用. 1.定义实体类Account package entit

随机推荐