【问题标题】:Access Headers at any time when implementing org.springframework.validation.Validator在实现 org.springframework.validation.Validator 时随时访问 Headers
【发布时间】:2020-05-08 17:33:37
【问题描述】:

我有一个 Spring Boot 应用程序,我需要根据标头值对请求的字段执行一些验证。

所以就像任何其他 Spring Boot 应用程序一样,我的休息控制器中的入口点看起来像

public ResponseEntity<Mono<MyResponse>> myOperation(MyRequest request, String another_parameter)

我的问题是,为了执行我的验证,我正在考虑使用org.springframework.validation.Validator

当你想实现上面的接口时,你必须做这样的事情:

public class WebsiteUserValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return MyRequest.class.equals(clazz);
    }

    @Override
    public void validate(Object obj, Errors errors) {
        MyRequest user = (MyRequest) obj;
        if (checkInputString(MyRequest.getSomeField())) {
            errors.rejectValue("someField", "someField.empty");
        }
    }

    private boolean checkInputString(String input) {
        return (input == null || input.trim().length() == 0);
    }
}

我想获得validate 方法实现中的标头。

如何做到这一点? (可以随时获取标题)。

【问题讨论】:

    标签: java spring spring-boot spring-mvc spring-validator


    【解决方案1】:

    我认为使用javax.validation.ConstraintValidator&lt;A extends Annotation, T&gt; 会更好。 例如 注释

    @Target({ElementType.TYPE, ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy ={SexConstraintValidator.class} )
    public @interface Sex {
        //default error message
        String message() default "default error message";
        //groups
        Class<?>[] groups() default {};
        //payload
        Class<? extends Payload>[] payload() default {};
    }
    

    SexConstraintValidator

    public class SexConstraintValidator implements ConstraintValidator<Sex,String> {
    
        @Override
        public void initialize(Sex constraintAnnotation) {
    
        }
    
        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {
            boolean isValid =doSomeValided();
            return isValid;
        }
    
    }
    

    验证对象

    public class ValidateObject {
    
        @Sex(message="error message")
        private String sex;
    
        // ...
    }
    

    验证方法

    import org.springframework.validation.annotation.Validated;
    public ResponseEntity<Mono<MyResponse>> myOperation(@Validated ValidateObject request, String another_parameter)
    

    或像这样验证手册

    ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
    Set<ConstraintViolation<ValidateObject>> validate=validatorFactory.getValidator().validate(validateObject);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 2021-01-12
      相关资源
      最近更新 更多