• 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
  • 相关阅读:
    linux安装docker-compose
    WPF数据绑定(指定源(Source)的几种方法)(三)
    服务器数据恢复—存储硬盘坏道,指示灯亮黄色的数据恢复案例
    C++ 模板和 C# 泛型之间的区别【示例语法说明】
    jvm关闭时的钩子函数
    永磁同步电机FOC驱动代码讲解
    go语言学习之旅之Go语言基础语法二
    计算机毕业设计之java+ssm网上书店销售管理系统
    浏览器基本原理
    墙面想贴好墙布,这些方法指南一定要看~好佳居窗帘十大品牌
  • 原文地址:https://blog.csdn.net/zhuyu19911016520/article/details/133860352