Hibernate Validator не проверяет параметры метода, аннотированные аннотациями ограничений - PullRequest
0 голосов
/ 13 июня 2019

У меня есть pojo, которое является общим для нескольких сервисов, и у каждого из них есть свои правила проверки для этого объекта. Итак, я расширяю это pojo в каждом из моих сервисов, переопределяю некоторые из установщиков и бросаю проверки ограничений на эти переопределенные методы. Pojo создается из представленного JSON через вызов REST. Джексон - это библиотека, которая должна вызывать сеттер.

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

Вот мое объявление метода REST:

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

Кажется, что проверка не работает, в частности, с Джексоном, поскольку я вижу validateParameters метод org.hibernate.validator.internal.engine.ValidatorImpl, вызываемый другими методами.

Вот как мой ValidationConfiguration боб выглядит так:

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;
    }
}

Я также проверяю параметры запроса, и он работает хорошо. Однако, это не работает для этого сеттера.

1 Ответ

0 голосов
/ 14 июня 2019

Я не мог заставить его работать с сеттерами, но, как ни странно, валидация включала его. Хотя получатели не вызываются явно. Кажется, это связано с Джексоном?

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