分享免费的编程资源和教程

网站首页 > 技术教程 正文

SpringMVC,SpringBoot快速验证参数是否完整 基于@Valid注解

goqiw 2024-09-24 16:05:02 技术教程 23 ℃ 0 评论

前言

在接口开发中,经常是需要对传入参数完整性进行验证的,或者对手机号格式进行验证等,而一般不了解@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上面测试过可行性。

感兴趣的小伙伴可以来我的Java交流群,可以获取免费的学习资料 828 697 593

对Java技术,架构技术感兴趣的同学,欢迎加群,一起学习,相互讨论。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表