美文网首页spring boot
SpringMVC,SpringBoot快速验证参数是否完整

SpringMVC,SpringBoot快速验证参数是否完整

作者: Raye | 来源:发表于2019-05-08 09:28 被阅读136次

    前言

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

    相关文章

      网友评论

        本文标题:SpringMVC,SpringBoot快速验证参数是否完整

        本文链接:https://www.haomeiwen.com/subject/xhvpoqtx.html