【问题标题】:Hibernate Validator doesn't validate method parameters annotated with constraint annotationsHibernate Validator 不验证带有约束注解的方法参数
【发布时间】:2019-06-13 15:15:45
【问题描述】:

我有一个 pojo,这对于多个服务很常见,并且每个服务对该对象都有不同的验证规则。因此,我在我的每个服务中扩展了该 pojo,并覆盖了一些设置器并在那些被覆盖的方法上抛出了约束验证。 pojo 是通过 REST 调用从提交的 json 构建的。 Jackson 是应该调用 setter 的库。

    @JsonSetter("name")
    public void setName(@Length(min = 1, max = 50) @NotBlank String name) {
        this.name = name;
    }

这是我的 REST 方法声明:

public ResponseEntity<?> createEntity(@Valid @RequestBody EntityDTO entity) {

似乎验证不适用于 Jackson,因为我看到在其他方法上调用了 org.hibernate.validator.internal.engine.ValidatorImplvalidateParameters 方法。

这就是我的ValidationConfiguration bean 的样子:

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.validation.MessageInterpolatorFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;

import javax.validation.Validator;

@Configuration
public class ValidationConfiguration {
    public ValidationConfiguration() {
    }

    @Bean(name = "overriddenValidator")
    public Validator validator() {
        LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
        factoryBean.setParameterNameDiscoverer(new CustomParameterNameDiscoverer());
        MessageInterpolatorFactory interpolatorFactory = new MessageInterpolatorFactory();
        factoryBean.setMessageInterpolator(interpolatorFactory.getObject());
        return factoryBean;
    }


    @Bean
    public static MethodValidationPostProcessor methodValidationPostProcessor(Environment environment, @Qualifier("overriddenValidator") Validator validator) {
        validator.forExecutables();
        MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
        boolean proxyTargetClass = (Boolean) environment.getProperty("spring.aop.proxy-target-class", Boolean.class, true);
        processor.setProxyTargetClass(proxyTargetClass);
        processor.setValidator(validator);
        return processor;
    }
}

我还对请求参数进行了一些验证,效果很好。但是,它不适用于这个 setter。

【问题讨论】:

    标签: jackson hibernate-validator spring-validator javax.validation


    【解决方案1】:

    我不能让它在 setter 上工作,但是,奇怪的是,验证在 getter 上开始了。即使没有显式调用 getter。好像和杰克逊有关??

        @Override
        @Length(min = 1, max = 50)
        @NotBlank
        public String getName() {
            return super.getName();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多