zoukankan      html  css  js  c++  java
  • @Validated校验

    应用:

    1. @Validated 声明要检查的参数

    这里我们在控制器层进行注解声明

    /**
         * 走参数校验注解
         *
         * @param userDTO
         * @return
         */
        @PostMapping("/save/valid")
        public RspDTO save(@RequestBody @Validated UserDTO userDTO) {
            userService.save(userDTO);
            return RspDTO.success();
        }

    2. 对参数的字段进行注解标注

    import lombok.Data;
    import org.hibernate.validator.constraints.Length;
    
    import javax.validation.constraints.*;
    import java.io.Serializable;
    import java.util.Date;
    
    /**
     * @ClassName: UserDTO
     * @Description: 用户传输对象
     * @date 2019/7/30 13:55
     */
    @Data
    public class UserDTO implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        /*** 用户ID*/
        @NotNull(message = "用户id不能为空")
        private Long userId;
    
        /** 用户名*/
        @NotBlank(message = "用户名不能为空")
        @Length(max = 20, message = "用户名不能超过20个字符")
        @Pattern(regexp = "^[\u4E00-\u9FA5A-Za-z0-9\*]*$", message = "用户昵称限制:最多20字符,包含文字、字母和数字")
        private String username;
    
        /** 手机号*/
        @NotBlank(message = "手机号不能为空")
        @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误")
        private String mobile;
    
        /**性别*/
        private String sex;
    
        /** 邮箱*/
        @NotBlank(message = "联系邮箱不能为空")
        @Email(message = "邮箱格式不对")
        private String email;
    
        /** 密码*/
        private String password;
    
        /*** 创建时间 */
        @Future(message = "时间必须是将来时间")
        private Date createTime;
    
    }

    3. 在全局校验中增加校验异常

    MethodArgumentNotValidException是springBoot中进行绑定参数校验时的异常,需要在springBoot中处理,其他需要 处理ConstraintViolationException异常进行处理.

    • 为了优雅一点,我们将参数异常,业务异常,统一做了一个全局异常,将控制层的异常包装到我们自定义的异常中
    • 为了优雅一点,我们还做了一个统一的结构体,将请求的code,和msg,data一起统一封装到结构体中,增加了代码的复用性
    import com.boot.lea.mybot.dto.RspDTO;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.dao.DuplicateKeyException;
    import org.springframework.web.bind.MethodArgumentNotValidException;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RestControllerAdvice;
    import org.springframework.web.servlet.NoHandlerFoundException;
    
    import javax.validation.ConstraintViolationException;
    import javax.validation.ValidationException;
    
    
    /**
     * @ClassName: GlobalExceptionHandler
     * @Description: 全局异常处理器
     * @date 2019/7/30 13:57
     */
    @RestControllerAdvice
    public class GlobalExceptionHandler {
    
        private Logger logger = LoggerFactory.getLogger(getClass());
    
        private static int DUPLICATE_KEY_CODE = 1001;
        private static int PARAM_FAIL_CODE = 1002;
        private static int VALIDATION_CODE = 1003;
    
        /**
         * 处理自定义异常
         */
        @ExceptionHandler(BizException.class)
        public RspDTO handleRRException(BizException e) {
            logger.error(e.getMessage(), e);
            return new RspDTO(e.getCode(), e.getMessage());
        }
    
        /**
         * 方法参数校验
         */
        @ExceptionHandler(MethodArgumentNotValidException.class)
        public RspDTO handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
            logger.error(e.getMessage(), e);
            return new RspDTO(PARAM_FAIL_CODE, e.getBindingResult().getFieldError().getDefaultMessage());
        }
    
        /**
         * ValidationException
         */
        @ExceptionHandler(ValidationException.class)
        public RspDTO handleValidationException(ValidationException e) {
            logger.error(e.getMessage(), e);
            return new RspDTO(VALIDATION_CODE, e.getCause().getMessage());
        }
    
        /**
         * ConstraintViolationException
         */
        @ExceptionHandler(ConstraintViolationException.class)
        public RspDTO handleConstraintViolationException(ConstraintViolationException e) {
            logger.error(e.getMessage(), e);
            return new RspDTO(PARAM_FAIL_CODE, e.getMessage());
        }
    
        @ExceptionHandler(NoHandlerFoundException.class)
        public RspDTO handlerNoFoundException(Exception e) {
            logger.error(e.getMessage(), e);
            return new RspDTO(404, "路径不存在,请检查路径是否正确");
        }
    
        @ExceptionHandler(DuplicateKeyException.class)
        public RspDTO handleDuplicateKeyException(DuplicateKeyException e) {
            logger.error(e.getMessage(), e);
            return new RspDTO(DUPLICATE_KEY_CODE, "数据重复,请检查后提交");
        }
    
    
        @ExceptionHandler(Exception.class)
        public RspDTO handleException(Exception e) {
            logger.error(e.getMessage(), e);
            return new RspDTO(500, "系统繁忙,请稍后再试");
        }
    }
     

    4.测试

    如下文:确实做到了参数校验时返回异常信息和对应的code,方便了我们不再繁琐的处理参数校验
     
     
     
     
     
  • 相关阅读:
    乔布斯《遗失的访谈》全文:尘封16年的预见
    Java开发超级工具集
    android root权限破解分析
    android linux 命令
    Dom加载让图片加载完再执行
    关于chrome dev tools一些技巧
    1 MySQL基础知识笔记
    教我SQL的老师
    SQL limit和offset的使用
    一次批量复制多个不同结果到剪贴板不用在粘贴文本与被粘贴文本之间反复横跳啦,
  • 原文地址:https://www.cnblogs.com/lzghyh/p/12728294.html
Copyright © 2011-2022 走看看