美文网首页Java后端JAVA少用百度,多看官方文档
刨根问底:Spring boot中如何进行参数校验

刨根问底:Spring boot中如何进行参数校验

作者: 大神带我来搬砖 | 来源:发表于2018-05-05 11:47 被阅读15466次

    Spring boot开发web项目有时候我们需要对controller层传过来的参数进行一些基本的校验,比如非空、整数值的范围、字符串的长度、日期、邮箱等等。Spring支持JSR-303 Bean Validation API,可以方便的进行校验。

    使用注解进行校验

    先定义一个form的封装对象

    class RequestForm {
    
        @Size(min = 1, max = 5)
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }
    

    其中name这个字段用Size注解限制长度1到5。Size是javax.validation包中的constraint注解。
    在使用时用@Valid注解表示要校验这个bean。

        @ResponseBody
        @GetMapping(value = "bean")
        public String validate(@Valid RequestForm request) {
            System.out.println(request.getName());
            return "OK";
        }
    

    自定义注解

    如果内置的注解不够用,可以自定义注解。
    比如先定义一个注解NameConstraint,限制name字段只能从特定数据中选取。

    @Target({ ElementType.FIELD, ElementType.PARAMETER })
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = NameConstraintValidator.class)
    @interface NameConstraint {
        String[] allowedValues();
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    
        String message();
    }
    

    其中allowedValues表示合法的取值范围,message是校验失败的显示信息。
    message、groups、payload是hibernate validator要求的字段,想了解的请看官方文档
    再定义一个validator做真正的校验

    class NameConstraintValidator implements ConstraintValidator<NameConstraint, String> {
    
        private String[] validValues;
    
        @Override
        public void initialize(NameConstraint constraintAnnotation) {
            validValues = constraintAnnotation.allowedValues();
        }
    
        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {
            for (String s : this.validValues) {
                if (s.equals(value)) {
                    return true;
                }
            }
            return false;
        }
    
    }
    

    在form bean中按如下方式使用

    class RequestFormWithCustomConstraint {
    
        @NameConstraint(allowedValues = { "bar", "foo" }, message = "只允许bar,foo")
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }
    

    直接校验参数

    只有一个name字段,不想封装一个对象怎么办?可以直接校验该参数

    @Controller
    @Validated
    @RequestMapping(value = "validator")
    public class ParameterValidatorDemoController {
    
        @ResponseBody
        @GetMapping(value = "simple")
        public String validateParameter(@Size(min = 1, max = 5) String name) {
            System.out.println(name);
            return "OK";
        }
    
    }
    

    controller上面的@Validated注解则告诉spring需要扫描这个类,来检查其中的constraint注解。

    详细信息可以参考官方文档有关章节
    https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#boot-features-validation
    https://docs.spring.io/spring/docs/4.3.16.RELEASE/spring-framework-reference/htmlsingle/#validation-beanvalidation

    代码在github
    https://github.com/kabike/spring-boot-demo

    相关文章

      网友评论

      本文标题:刨根问底:Spring boot中如何进行参数校验

      本文链接:https://www.haomeiwen.com/subject/bpssrftx.html