spring boot validation参数校验
对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证。 Spring Boot自身对数据在服务端的校验有一个比较好的支持,它能将我们提交到服务端的数据按照我们事先的约定进行数据有效性验证。
1 pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2 校验使用实例
- 配置要验证的请求实体
public class User {
@Null
private Long id;
@NotBlank
private String name;
@Email
private String email;
// 省略getter和setter
}
- 控制器方法配置
@PostMapping("/addUser")
public String addUser(@Valid @RequestBody User user){
...
}
- 校验失败统一处理
校验失败时将抛出MethodArgumentNotValidException异常
/**
* 全局Exception处理
*
* @author liusq
*
*/
@RestControllerAdvice
public class GlobalExceptionHandler { private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class); @SuppressWarnings("rawtypes")
@ExceptionHandler(value = Exception.class)
public ResponseEntity handle(Exception e) {
if (e instanceof MethodArgumentNotValidException) {
BindingResult bindingResult = ((MethodArgumentNotValidException) e).getBindingResult();
if (bindingResult.hasErrors() && bindingResult.hasFieldErrors()) {
FieldError fieldError = bindingResult.getFieldError();
BodyValidStatus bodyValidStatus = new BodyValidStatus.Builder().code("0009")
.message(fieldError.getDefaultMessage())
.field(fieldError.getField()).build();
LOGGER.warn(bodyValidStatus.getMessage() + e);
return new ResponseEntity<>(bodyValidStatus, HttpStatus.OK);
} else {
bodyStatus = DataUtil.bodyStatus("0009");
}
} else {
bodyStatus = DataUtil.bodyStatus(Constants.ERROR_CODE);
}
LOGGER.error(bodyStatus.getMessage() + e);
return new ResponseEntity<>(bodyStatus, HttpStatus.OK);
}
}
public class BodyValidStatus {
// 错误代码
private String code;
// 错误代码解释
private String message;
// 错误字段
private String field; public BodyValidStatus() {
} public BodyValidStatus(String code, String message, String field) {
this.code = code;
this.message = message;
this.field = field;
} private BodyValidStatus(Builder builder) {
setCode(builder.code);
setMessage(builder.message);
setField(builder.field);
} public String getCode() {
return code;
} public void setCode(String code) {
this.code = code;
} public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} public String getField() {
return field;
} public void setField(String field) {
this.field = field;
} @Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
} public static final class Builder {
private String code;
private String message;
private String field; public Builder() {
} public Builder code(String val) {
code = val;
return this;
} public Builder message(String val) {
message = val;
return this;
} public Builder field(String val) {
field = val;
return this;
} public BodyValidStatus build() {
return new BodyValidStatus(this);
}
}
}
3 验证注解详解
|
验证注解 |
验证的数据类型 |
说明 |
|
空检查 |
||
|
任意类型 |
验证注解的元素值是null |
|
|
任意类型 |
验证注解的元素不是null |
|
|
@NotBlank |
CharSequence子类型(CharBuffer、String、StringBuffer、StringBuilder) |
验证注解的元素值不为空(不为null、去除首尾空格后长度不为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的首尾空格 |
|
@NotEmpty |
CharSequence子类型、Collection、Map、数组 |
验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
|
Boolean检查 |
||
|
@AssertFalse |
Boolean,boolean |
验证注解的元素值是false |
|
@AssertTrue |
Boolean,boolean |
验证注解的元素值是true |
|
长度检查 |
||
|
@Size(min=下限, max=上限) |
字符串、Collection、Map、数组等 |
验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小 |
|
@Length(min=下限, max=上限) |
CharSequence子类型 |
验证注解的元素值长度在min和max区间内 |
|
日期检查 |
||
|
@Past |
java.util.Date,java.util.Calendar;Joda Time类库的日期类型 |
验证注解的元素值(日期类型)比当前时间早 |
|
@Future |
与@Past要求一样 |
验证注解的元素值(日期类型)比当前时间晚 |
|
数值检查 |
||
|
@MIN(value=值) |
BigDecimal,BigInteger, byte,short, int, long,等任何Number或CharSequence(存储的是数字)子类型 |
验证注解的元素值大于等于@Min指定的value值 |
|
@MAX(value=值) |
和@Min要求一样 |
验证注解的元素值小于等于@Max指定的value值 |
|
@DecimalMin(value=值) |
和@Min要求一样 |
验证注解的元素值大于等于@ DecimalMin指定的value值 |
|
@DecimalMax(value=值) |
和@Min要求一样 |
验证注解的元素值小于等于@ DecimalMax指定的value值 |
|
@Digits(integer=整数位数, fraction=小数位数) |
和@Min要求一样 |
验证注解的元素值的整数位数和小数位数上限 |
|
@Range(min=最小值, max=最大值) |
BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子类型和包装类型 |
验证注解的元素值在最小值和最大值之间 |
|
其他检查 |
||
|
@Valid |
任何非原子类型 |
指定递归验证关联的对象;如用户对象中有个地址对象属性,如果想在验证用户对象时一起验证地址对象的话,在地址对象上加@Valid注解即可级联验证 |
|
@Pattern(regexp=正则表达式,flag=标志的模式) |
CharSequence的子类型 |
验证注解的元素值与指定的正则表达式匹配 |
|
@Email(regexp=正则表达式,flag=标志的模式) |
CharSequence的子类型 |
验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式 |
|
@CreditCardNumber |
CharSequence的子类型 |
验证注解元素值是信用卡卡号 |
|
@ScriptAssert(lang= ,script=) |
业务类 |
校验复杂的业务逻辑 |
4 自定义验证注解和验证规则
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import javax.validation.Constraint;
import javax.validation.Payload; import com.xxx.xxx.constraint.impl.MoneyValidator; @Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MoneyValidator.class)
public @interface Money { String message() default"不是金额形式"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
import java.util.regex.Pattern; import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext; import com.xxx.xxx.constraint.Money; public class MoneyValidator implements ConstraintValidator<Money, Double> { private String moneyReg = "^\\d+(\\.\\d{1,2})?$";//表示金额的正则表达式
private Pattern moneyPattern = Pattern.compile(moneyReg); public void initialize(Money money) {
// TODO Auto-generated method stub } public boolean isValid(Double value, ConstraintValidatorContext arg1) {
// TODO Auto-generated method stub
if (value == null)
return true;
return moneyPattern.matcher(value.toString()).matches();
} }
spring boot validation参数校验的更多相关文章
- Spring基础系列-参数校验
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9953744.html Spring中使用参数校验 概述 JSR 303中提出了Bea ...
- spring注解式参数校验
很痛苦遇到大量的参数进行校验,在业务中还要抛出异常或者返回异常时的校验信息,在代码中相当冗长,今天我们就来学习spring注解式参数校验. 其实就是:hibernate的validator. 开始啦. ...
- spring boot 输入参数统一校验
1 引入spring boot validate maven 依赖 <!-- 验证 --> <dependency> <groupId>org.hiberna ...
- Kotlin + Spring Boot 请求参数验证
编写 Web 应用程序的时候,经常要做的事就是要对前端传回的数据进行简单的验证,比如是否非空.字符长度是否满足要求,邮箱格式是否正确等等.在 Spring Boot 中,可以使用 Bean Valid ...
- 【spring】-- jsr303参数校验器
一.为什么要进行参数校验? 当我们在服务端控制器接受前台数据时,肯定首先要对数据进行参数验证,判断参数是否为空?是否为电话号码?是否为邮箱格式?等等. 这里有个问题要注意: 前端代码一般上会对这些数据 ...
- Spring boot 配置文件参数映射到配置类属性
[参考文章]:SpringBoot之@EnableConfigurationProperties分析 [参考文章]:在Spring Boot中使用 @ConfigurationProperties 注 ...
- javax.validation参数校验
在实体字段加注解: /** * 机构名称 */ @ApiParam(name = "orgName", value = "机构名称") @Size(max = ...
- Spring Boot 构造器参数绑定,越来越强大了!
在之前的文章:Spring Boot读取配置的几种方式,我介绍到 Spring Boot 中基于 Java Bean 的参数绑定,在一个 Java Bean 类上用 @ConfigurationPro ...
- 解放生产力:Spring Boot的注解校验
关于对象入参的校验,我们可能第一个想到的就是在Controller层或者Service层增加很多if else的判断,如: if (user.getPassword() == "" ...
随机推荐
- Java之路---Day08
2019-10-22-22:28:39 目录 1.Static静态类 2.Static内存图 3.Static静态代码块 4.Arrays类 5.Math类 Static静态类 一旦使用static修 ...
- Spring中获取被代理的对象
目录 Spring中获取被代理的对象 获取Spring被代理对象什么时候可能会用到? Spring中获取被代理的对象 Spring中获取被代理的对象 ### 获取Spring被代理对象的JAVA工具类 ...
- 使用 chroot 建立沙盒环境
使用 chroot 建立沙盒环境 chroot 提供了更改当前进程及其子进程的可见根目录的操作,运行在此隔离环境中的应用程序无法访问新的目录树之外的文件和命令.这样的隔离环境称作 chroot 监狱( ...
- mongodb replica-set
mongodb 主从复制 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系 ...
- 肖哥HCNP-学前准备篇笔记
HCNA:助理 HCNP:工程师 HCIE:专家 vmvare workstation 1.安装 2.创建新的虚拟机-->典型-->稍后安装系统-->选择系统模式-->选择位置 ...
- 树莓派3b安装opencv
前言:最近买了一个CSI接口的摄像头,最准用树莓派做人脸识别项目.树莓派上本身已经安装了python2.python3,最开始通过sudo apt-get install python3-opencv ...
- robotframework+Python3.7 接口自动化测试
具体的测试用例,password,channel,resultCode传给接口描述 集成了一些常见的测试接口方法 1. Get请求下,
- Uva1349Optimal Bus Route Design(二分图最佳完美匹配)(最小值)
题意: 给定n个点的有向图问,问能不能找到若干个环,让所有点都在环中,且让权值最小,KM算法求最佳完美匹配,只不过是最小值,所以把边权变成负值,输出时将ans取负即可 这道题是在VJ上交的 #incl ...
- rocketmq那些事儿之本地调试环境搭建
上一篇文章中我们已经介绍过rocketmq的集群环境搭建,然而在源码的学习中我们还需要进行本地的调试和问题的定位查找,毕竟还是在本地方便些,今天就说一说如何进行源码的本地调试 下载编译 对于rocke ...
- less-6
首先输入id=1和id=1’未报错,均显示You are in.....(如下图所示) 由上图可以看到,如果运行返回结果正确的时候只返回you are in...,不会返回数据库当中的信息了,可以从这 ...