SpringMVC,SpringBoot快速验证参数是否完整
前言
在接口开发中,经常是需要对传入参数完整性进行验证的,或者对手机号格式进行验证等,而一般不了解@Valid注解之前,都是通过自己封装方法来验证,都是一堆if else集合,这样判断对于代码结构很不友好,开发效率也不高,使用@Valid注解可以快速的对参数进行验证,并且可以通过抓取全局异常,从而实现统一返回
引用
@Valid是使用hibernate validation的时候使用,其中java的jsr303声明了这类接口,hibernate-validator对其进行了实现
在进行maven整合时,需要引入的依赖
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.13.Final</version>
</dependency>
一般情况下早已被其他框架引入了,只是在不存在的时候需要进行引用一下,@Valid只是验证参数是否符合要求,但是具体参数需要符合什么要求,还是需要其他注解来标志验证规则
验证规则标签
@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=) 验证字符串长度是否在给定的范围之内
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则
@Min 验证 Number 和 String 对象是否大等于指定的值
@Max 验证 Number 和 String 对象是否小等于指定的值
@DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits 验证 Number 和 String 的构成是否合法
@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Range(min=, max=) 验证元素是否在合适的范围内
@Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。
使用
在需要验证的类属性上添加相应的注解,如:
import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;
@Data
public class LoginVO {
@NotBlank
private String username;
@NotBlank
private String password;
}
在SpringMVC控制层中使用@Valid注解进行验证,并判断是否有异常
@PostMapping("login")
public String login(@Valid LoginVO vo, Errors errors){
if (errors.hasErrors()) {
List<FieldError> list = errors.getFieldErrors();
StringBuffer sb = new StringBuffer("参数:");
for(FieldError error : list){
sb.append(error.getField()).append(",");
}
sb.append("不符合要求");
return sb.toString();
}
return "验证通过";
}
当然上面Controller层的代码非常容易重复,毕竟差不多的方法都需要验证参数,所以为了方面和简洁代码,可以通过抓取全局异常的方式返回提示信息
全局异常处理
通过配置全局异常处理方法,抓取BindException,返回异常提示信息
import com.wxkingbos.patrol.model.WebResult;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 全局异常处理器
* Created by Raye on 2019-04-15
*/
@ControllerAdvice
public class ExceptionControllerAdvice {
@ExceptionHandler(BindException.class)
@ResponseBody
public String bindExceptionHandler(BindException ex){
if(ex.hasErrors()){
List<FieldError> list = ex.getFieldErrors();
StringBuffer sb = new StringBuffer("参数:");
for(FieldError error : list){
sb.append(error.getField()).append(",");
}
sb.append("不符合要求");
return sb.toString();
}
return ex.getMessage();
}
}
同理,也可以采用此方法抓取其他全局异常,进行异常日志捕捉获取其他异常提示,另外以上全局异常配置只有在Springboot项目上运行过,因为现在项目差不多都是基于Springboot构建的了,所以也没有在非Springboot上面测试过可行性