Весенняя проверка JSR-303 @NotNull throw NotReadablePropertyException - PullRequest
0 голосов
/ 06 июля 2018

У меня есть два класса

@Data
@NoArgsConstructor
public class SearchProductOffer {
    @Valid
    private List<MatchProperty> properties = new ArrayList<>();
}
@Data
@NoArgsConstructor
public class MatchProperty {
    private String version;
    private String sourceSystem;
    @NotNull(message = "Версия должна быть заполнена!")
    public String codeName;
}

пока я проверяю A с помощью ValidationUtil.invokeValidator, я получаю

2018-07-06 16: 04: 09.769 ОШИБКА 10223 --- [nio-8080-exec-1] o.a.c.c.C. [. [. [/]. [dispatcherServlet]: Servlet.service () для сервлет [dispatcherServlet] в контексте с путем [] вызвал исключение [Ошибка обработки запроса; вложенное исключение java.lang.IllegalStateException: проверенное свойство JSR-303 У свойства [1] .codeName нет соответствующего средства доступа для Связывание данных Spring - проверьте конфигурацию вашего DataBinder (бин свойство в сравнении с прямым доступом к полю)] с первопричиной

org.springframework.beans.NotReadablePropertyException: Invalid свойство 'properties [1]' класса бина [java.lang.String]: бин свойство 'properties [1]' недоступно для чтения или содержит недопустимый метод получения Метод: Соответствует ли тип возвращаемого значения получателя параметру типа сеттер? в org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue (AbstractNestablePropertyAccessor.java:622) ~ [весна-бобы-5.0.7.RELEASE.jar: 5.0.7.RELEASE]

когда поле B равно нулю. Оба класса имеют геттер / сеттер. Spring Boot 2.0.3.RELEASE

UPDATE Я получаю исключение каждый раз, когда я хочу проверить с помощью поля @NotNull (в то время как значение поля равно нулю) или @NotEmpty (в то время как мое поле равно "") во внутреннем классе.

1 Ответ

0 голосов
/ 09 июля 2018

Решение: удалить пружину SmartValidator .Сконфигурируйте связыватель в контроллере

@InitBinder
    private void initBinder(WebDataBinder dataBinder) {
        dataBinder.initDirectFieldAccess();
    }

Сконфигурируйте валидатор в загрузочном конфиге

@Bean
    public LocalValidatorFactoryBean getValidator() {
        return new LocalValidatorFactoryBean();
    }

и вставьте его в контроллер

@Autowired
    private LocalValidatorFactoryBean validator;

после того, как мы сможем вызвать

List<ConstraintViolation<Object>> validationResult = new ArrayList<>();
validationResult.addAll(validator.validate(request));   
validationResult.addAll(validator.validate(methodBean));     

и проверьте validationResult на наличие ошибок проверки

...