zoukankan      html  css  js  c++  java
  • SpringBoot 使用validation数据校验

    后端对数据进行验证

    添加包

    hibernate-validator

        <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
            <dependency>
                <groupId>org.hibernate.validator</groupId>
                <artifactId>hibernate-validator</artifactId>
                <version>6.0.2.Final</version>
            </dependency>

    或者添加spring-boot-starter-validation

            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation -->
         <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-validation</artifactId>
                <version>1.4.0.RELEASE</version>
            </dependency>

    或者添加spring-boot-starter-web

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>

    这两个springboot包里面都包含hibernate-validator包,这三个包只有有一个就可以

    二:返回信息

    我这里通过抛出异常来统一返回异常信息

    import com.shitou.huishi.contract.datacontract.code.RspCode;
    import com.shitou.huishi.contract.datacontract.exception.AuthException;
    import com.shitou.huishi.contract.datacontract.response.DataResponse;
    import javax.servlet.http.HttpServletRequest;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.validation.BindingResult;
    import org.springframework.validation.FieldError;
    import org.springframework.web.bind.MethodArgumentNotValidException;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    /**
     * Created by qhong on 2018/5/28 15:51
     **/
    @ControllerAdvice
    public class GlobalExceptionHandler {
    
        private Logger logger = LoggerFactory.getLogger(getClass());
    
        /**
         * 登陆异常
         * @param req
         * @param e
         * @return
         * @throws AuthException
         */
        @ExceptionHandler(value = AuthException.class)
        @ResponseBody
        public DataResponse handleAuthException(HttpServletRequest req, AuthException e) throws AuthException {
            DataResponse r = new DataResponse();
            r.setResCode(e.getCode()+"");
            r.setMsg(e.getMsg());
            logger.info("AuthException",e.getMsg());
            return r;
        }
    
        /**
         * 验证异常
         * @param req
         * @param e
         * @return
         * @throws MethodArgumentNotValidException
         */
        @ExceptionHandler(value = MethodArgumentNotValidException.class)
        @ResponseBody
        public DataResponse handleMethodArgumentNotValidException(HttpServletRequest req, MethodArgumentNotValidException e) throws MethodArgumentNotValidException {
            DataResponse r = new DataResponse();
            BindingResult bindingResult = e.getBindingResult();
            String errorMesssage = "Invalid Request:
    ";
    
            for (FieldError fieldError : bindingResult.getFieldErrors()) {
                errorMesssage += fieldError.getDefaultMessage() + "
    ";
            }
            r.setResCode(RspCode.VERIFICATION_DOES_NOT_PASS.getCode());
            r.setMsg(errorMesssage);
            logger.info("MethodArgumentNotValidException",e);
            return r;
        }
    
        /**
         * 全局异常
         * @param req
         * @param e
         * @return
         * @throws Exception
         */
        @ExceptionHandler(value = Exception.class)
        @ResponseBody
        public DataResponse handleException(HttpServletRequest req, Exception e) throws Exception {
            DataResponse r = new DataResponse();
            r.setResCode(RspCode.CODE_ERROR.getCode());
            r.setMsg(RspCode.CODE_ERROR.getMessage()+","+e.getMessage());
            logger.error(e.getMessage(),e);
            return r;
        }
    }

    三:具体代码

    总结框架提供了那些校验:

    JSR提供的校验注解:         
    @Null   被注释的元素必须为 null    
    @NotNull    被注释的元素必须不为 null    
    @AssertTrue     被注释的元素必须为 true    
    @AssertFalse    被注释的元素必须为 false    
    @Min(value)     被注释的元素必须是一个数字,其值必须大于等于指定的最小值    
    @Max(value)     被注释的元素必须是一个数字,其值必须小于等于指定的最大值    
    @DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值    
    @DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值    
    @Size(max=, min=)   被注释的元素的大小必须在指定的范围内    
    @Digits (integer, fraction)     被注释的元素必须是一个数字,其值必须在可接受的范围内    
    @Past   被注释的元素必须是一个过去的日期    
    @Future     被注释的元素必须是一个将来的日期    
    @Pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式    
    
    
    Hibernate Validator提供的校验注解:  
    @NotBlank(message =)   验证字符串非null,且trim后长度必须大于0    
    @Email  被注释的元素必须是电子邮箱地址    
    @Length(min=,max=)  被注释的字符串的大小必须在指定的范围内    
    @NotEmpty   被注释的字符串的必须非空    
    @Range(min=,max=,message=)  被注释的元素必须在合适的范围内

    Code:

        @Range(min=1,max=2,message = "档案类型错误")
        private Integer archiveType;
    
        @NotBlank(message = "档案主体名称不能为空")
        private String subjectName;
    
        @NotBlank(message = "证件号不能为空")
        private String subjectNo;

    Controller:

    public DataResponse createArchive(@RequestBody @Valid ArchiveInfoRequest request)

    添加@Valid或者@Validated都可以。

    补充:

    网上提供的其他异常:

        @ExceptionHandler(value =BindException.class)
        @ResponseBody
        public DataResponse handleBindException(BindException e) throws BindException {
            // ex.getFieldError():随机返回一个对象属性的异常信息。如果要一次性返回所有对象属性异常信息,则调用ex.getAllErrors()
            FieldError fieldError = e.getFieldError();
            StringBuilder sb = new StringBuilder();
            sb.append(fieldError.getField()).append("=[").append(fieldError.getRejectedValue()).append("]")
                    .append(fieldError.getDefaultMessage());
            // 生成返回结果
            DataResponse r = new DataResponse();
            r.setResCode(RspCode.VERIFICATION_DOES_NOT_PASS.getCode());
            r.setMsg(sb.toString());
            logger.info("BindException", e);
            return r;
        }

    https://blog.csdn.net/u013815546/article/details/77248003

    https://blog.csdn.net/hry2015/article/details/79572713

  • 相关阅读:
    【学习总结】SQL的连接:join -- 内连接外连接左连接右连接
    【学习总结】测试工具jmeter-从入门到精通-汇总
    【刷题】面筋-数据库-关系型数据库与非关系型数据库Nosql区别汇总
    【刷题】面筋-数据结构-排序算法的复杂度、稳定性、内部外部排序
    【刷题】面筋-测开-测试应该什么时候介入
    【问题解决方案】GitHub图片不显示的问题通过修改hosts解决
    【刷题】面筋-网络-HTTP和HTTPS
    【刷题】面筋-网络-数据传输方式
    【刷题】面筋-网络-TCP三次握手和四次挥手的全过程
    【刷题】面筋-网络-常见网络模型与各层网络协议
  • 原文地址:https://www.cnblogs.com/hongdada/p/9179053.html
Copyright © 2011-2022 走看看