• 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

  • 相关阅读:
    [Tutorial] How to check and kill running processes in Ubuntu
    [Tutorial] Getting started with Gazebo in ROS
    Linux基础命令
    Linux安装系统
    vue 前后端数据交互问题解决
    如何在cmd中启动MongoDB服务器和客户端
    selenuim模块的使用 解析库
    beautifhulsoup4的使用
    浅谈scrapy框架安装使用
    自动登录 点赞 评论 抽屉网
  • 原文地址:https://www.cnblogs.com/hongdada/p/9179053.html
Copyright © 2020-2023  润新知