Spring Boot校验
来源:互联网 发布:js校验文本框输入数字 编辑:程序博客网 时间:2024/06/18 15:28
开发web项目有时候我们需要对controller层传过来的参数进行一些基本的校验,比如非空,非null,整数值的范围,字符串的个数,日期,邮箱等等。最常见的就是我们直接写代码校验,这样以后比较繁琐,而且不够灵活。
Bean Validation 1.0(JSR-303)是一个校验规范,在Spring Boot项目由于自带了Hibernate validator 5(http://hibernate.org/validator/)实现,所以我们可以非常方便的使用这个特性 。
核心的pom依赖:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.3.1.Final</version></dependency>
首先,需要我们声明一个Bean,注入校验器到Spring Boot的运行环境
@Configuration@EnableAutoConfigurationpublic class FactoryConfig { final static Logger logger= LoggerFactory.getLogger(FactoryConfig.class); @Bean public MethodValidationPostProcessor methodValidationPostProcessor(){ return new MethodValidationPostProcessor(); } }
校验常用的注解如下:
@AssertFalse 校验false@AssertTrue 校验true@DecimalMax(value=,inclusive=) 小于等于value,inclusive=true,是小于等于@DecimalMin(value=,inclusive=) 与上类似@Max(value=) 小于等于value@Min(value=) 大于等于value@NotNull 检查Null@Past 检查日期@Pattern(regex=,flag=) 正则@Size(min=, max=) 字符串,集合,map限制大小@Valid 对po实体类进行校验
下面看一个使用例子:
package hello;import javax.validation.constraints.Min;import javax.validation.constraints.NotNull;import javax.validation.constraints.Size;public class PersonForm { //名字不能为空,而且长度必须在2和30之间 @NotNull(message = "名称不能为空") @Size(min=2, max=30, message = "名字长度必须在2和30之间") private String name; //年龄不能为空,而且必须大于等于18岁 @NotNull @Min(18) private Integer age; public String getName() { return this.name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String toString() { return "Person(Name: " + this.name + ", Age: " + this.age + ")"; }}
接着看下如何在Controller层使用
//非实体类参数可以直接使用注解 @GetMapping("/check")@ResponseBodypublic String check(@Min(0,message = "kpId必须大于等于0") @RequestParam int kpId,@RequestParam int level) { return "ok";} //实体类注解校验使用@Valid @PostMapping("/") public String checkPersonInfo(@Valid PersonForm personForm, BindingResult bindingResult) { if (bindingResult.hasErrors()) { return "form"; } return "redirect:/results"; }
注意上面的Spring提供的BindingResult是错误结果的一个封装,我们可以在web页面中通过这个对象拿到详细的错误信息,
<td th:if="${#fields.hasErrors('age')}" th:errors="*{age}">Age Error</td>
spring boot 1.4默认使用 hibernate validator 5.2.4 Final实现校验功能。hibernate validator 5.2.4 Final是JSR 349 Bean Validation 1.1的具体实现。 一 初步使用hibernate vilidator主要使用注解的方式对bean进行校验,初步的例子如下所示:
package com.learn.validate.domain;import javax.validation.constraints.Min;import org.hibernate.validator.constraints.NotBlank;public class Student {//在需要校验的字段上指定约束条件 @NotBlank private String name; @Min(3) private int age; @NotBlank private String classess; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getClassess() { return classess; } public void setClassess(String classess) { this.classess = classess; }}
然后在controller中可以这样调用,加上@Validated注解即可。
package com.learn.validate.controller;import org.springframework.validation.annotation.Validated;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import com.learn.validate.domain.Student;@RestControllerpublic class ValidateController { @RequestMapping(value="testStudent") public void testStudent(@Validated Student student) { }}
如果校验失败,默认会返回Spring boot 框架的出错信息。是一个json串,里面有详细的出错描述。
二 使用gruops 属性来实现区别不同的校验需求
在上面的例子中,如果Student bean想要用于两个不同的请求中,每个请求有不同的校验需求,例如一个请求只需要校验name字段,一个请求需要校验name和age两个字段,那该怎么做呢?
使用注解的groups属性可以很好的解决这个问题,如下所示:package com.learn.validate.domain;import javax.validation.constraints.Min;import org.hibernate.validator.constraints.NotBlank;public class Student { //使用groups属性来给分组命名,然后在需要的地方指定命令即可 @NotBlank(groups=NAME.class) private String name; @Min(value=3,groups=AGE.class) private int age; @NotBlank private String classess; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getClassess() { return classess; } public void setClassess(String classess) { this.classess = classess; } public interface NAME{}; public interface AGE{};}
根据需要在@Validated属性中指定需要校验的分组名,可以指定1到多个。指定到的分组名会全部进行校验,不指定的不校验。
package com.learn.validate.controller;import org.springframework.validation.annotation.Validated;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import com.learn.validate.domain.Student;import com.learn.validate.domain.Student.AGE;import com.learn.validate.domain.Student.NAME;@RestControllerpublic class ValidateController { @RequestMapping(value="testStudent") public void testStudent(@Validated Student student) { } @RequestMapping(value="testStudent1") public void testStudent1(@Validated(NAME.class) Student student) { } @RequestMapping(value="testStudent2") public void testStudent2(@Validated({NAME.class,AGE.class}) Student student) { }}
三 使用 @ScriptAssert 注解校验复杂的业务逻辑
如果需要校验的业务逻辑比较复杂,简单的@NotBlank,@Min注解已经无法满足需求了,这时可以使用@ScriptAssert来指定进行校验的方法,通过方法来进行复杂业务逻辑的校验,然后返回 true或false来表明是否校验成功。例如下面的例子:package com.learn.validate.domain;import javax.validation.constraints.Min;import org.hibernate.validator.constraints.NotBlank;import org.hibernate.validator.constraints.ScriptAssert;import com.learn.validate.domain.Student.CHECK;//通过script 属性指定进行校验的方法,传递校验的参数,//依然可以通过groups属性指定分组名称@ScriptAssert(lang="javascript",script="com.learn.validate.domain.Student.checkParams(_this.name,_this.age,_this.classes)",groups=CHECK.class)public class Student { @NotBlank(groups=NAME.class) private String name; @Min(value=3,groups=AGE.class) private int age; @NotBlank private String classess; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getClassess() { return classess; } public void setClassess(String classess) { this.classess = classess; } public interface NAME{}; public interface AGE{}; public interface CHECK{}; //注意进行校验的方法要写成静态方法,否则会出现 //TypeError: xxx is not a function 的错误 public static boolean checkParams(String name,int age,String classes) { if(name!=null&&age>8&classes!=null) { return true; } else { return false; } }}
在需要的地方,通过分组名称进行调用
package com.learn.validate.controller;import org.springframework.validation.annotation.Validated;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import com.learn.validate.domain.Student;import com.learn.validate.domain.Student.CHECK;@RestControllerpublic class ValidateController { @RequestMapping(value="testStudent3") public void testStudent3(@Validated(CHECK.class) Student student) { }}
作者:vasthua
链接:http://www.jianshu.com/p/a9b1e2f7a749
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- Spring Boot Validator校验
- Spring boot 注解校验
- Spring Boot校验
- spring boot validator校验
- 59. Spring Boot Validator校验
- 59. Spring Boot Validator校验
- spring boot 自定义校验注解
- 59. Spring Boot Validator校验【从零开始学Spring Boot】
- Spring Boot项目使用参数校验
- Spring Boot项目使用参数校验
- spring boot 字段校验异常设计
- Spring Boot -- Controller之Validate参数校验
- Spring boot 使用 shiro做安全校验
- spring boot注解实现参数校验
- 如何在Spring Boot项目使用参数校验
- Kotlin & Spring boot 使用@Valid校验无效解决方法
- Spring Boot 拦截器 请求参数MD5签名校验
- Spring Boot -- Controller之Validate参数校验-实体类分组校验规则
- js-return ture to win
- 算法提高 ADV-179 解二元一次方程组
- 浅析MySQL中exists与in的使用 (写的非常好)
- 01 Hibernate基础
- Android中事件传递机制的总结
- Spring Boot校验
- 子窗体刷新父窗体
- Java 基础学习笔记之用for循环输出一个*号 1357的三角形
- Skiing( 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 )
- 数学编程 矩阵旋转
- TCP三次握手与四次挥手
- 想玩libevent竟然出错
- 程序的多文件组织
- CSS——很多让p变红的方法