2

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

 3 years ago
source link: https://www.raye.wang/springmvckuai-su-yan-zheng-can-shu-shi-fou-wan-zheng-valid/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

07 五月 2019 7:36:37 晚上

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK