• SpringBoot自定义参数校验注解


    1.引入依赖,spring validation是在hibernate-validator上做了一层封装

    
         org.springframework.boot
         spring-boot-starter-validation
     
    
    • 1
    • 2
    • 3
    • 4

    2.定义参数校验注解与处理器

    import javax.validation.Constraint;
    import javax.validation.Payload;
    import java.lang.annotation.*;
    
    @Documented
    @Retention(value = RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
    @Constraint(validatedBy = OrderCountValidator.class)
    public @interface OrderCountValid {
    
        String message() default "订单数量超出库存";
    
        Class[] groups() default {};
    
        Class[] payload() default {};
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    
    public class OrderCountValidator implements ConstraintValidator {
    
        //可以注入mapper、service进来
        @Autowired
        private OrderService orderService;
    
        @Override
        public boolean isValid(Integer buyCount, ConstraintValidatorContext context) {
            return orderService.OrderCountValid(buyCount);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    public class Order implements Serializable {
    
        //购买数量
        @OrderCount(message = "购买数量不能超出库存")
        @NotNull(message = "购买数量不能为空")
        private Integer buyCount;
    
        //订单编号
        private String orderCode;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.控制器

    @RestController
    @RequestMapping(value = "/order")
    public class OrderController {
    
        @PostMapping("/placeOrder")
        public String placeOrder(@RequestBody @Valid Order order){
            return "success";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4.全局异常处理器,自定义校验注解校验失败会抛出 javax.validation.ConstraintViolationException

    import org.springframework.stereotype.Component;
    import org.springframework.validation.BindingResult;
    import org.springframework.web.bind.MethodArgumentNotValidException;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RestControllerAdvice;
    
    import javax.validation.ConstraintViolation;
    import javax.validation.ConstraintViolationException;
    import java.util.stream.Collectors;
    
    @RestControllerAdvice
    @Component
    public class GlobalExceptionHandler {
    
        // 当直接校验具体参数时会出现javax.validation.ConstraintViolationException
        @ExceptionHandler(value = ConstraintViolationException.class)
        public String handleException1(ConstraintViolationException e) {
            // 拼接参数
            String errorMsg = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(", "));
            return errorMsg;
        }
    
        // 当直接校验具体参数时会出现org.springframework.web.bind
        @ExceptionHandler(value = MethodArgumentNotValidException.class)
        public String handleException2(MethodArgumentNotValidException e) {
            BindingResult exceptions = e.getBindingResult();
            // 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息
            if (exceptions.hasErrors()) {
                // 这里默认错误消息
                return exceptions.getFieldError().getDefaultMessage();
            }
            return "请求参数错误";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
  • 相关阅读:
    SSM+MySQL+JSP教务管理系统设计与实现(附源码下载地址)
    ArGIS Engine专题(15)之GP模型在地图服务与地图服务之间实现叠置分析
    集合的自反关系和对称关系
    南昌服务器托管让数据存储更安全
    MySQL基础增删改查以及备份还原操作
    台达PLC出现故障该怎么进行远程维护和程序上下载?
    JUnit测试模拟JoinPoint
    Python绘图系统18:导入txt格式数据
    Python基础语法
    vue项目electron打包
  • 原文地址:https://blog.csdn.net/zhuyu19911016520/article/details/133860352