2016-08-26 4 views
2

У меня есть Spring-JSON/RestAPI, которые используют проверку входных данных с помощью аннотаций. @ValidПроверка доступности Spring Spring Spring для конфигурации свойств

При попытке проверить объект внутри другого объекта возникает следующая ошибка.

java.lang.IllegalStateException: JSR-303 validated property 'client.application' does not have a corresponding accessor for Spring data binding - check your DataBinder's configuration (bean property versus direct field access) 
    at org.springframework.validation.beanvalidation.SpringValidatorAdapter.processConstraintViolations(SpringValidatorAdapter.java:153) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:108) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.validation.DataBinder.validate(DataBinder.java:866) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    ... 

Вот модель данных JSON, который используется здесь:

{ // @Valid MessageDTO 
    "title": "Test", 
    "message":"Test", 
    "client": { // @Valid ClientDTO 
    "application": "Test" 
    } 
} 

я пропускаю определение Java здесь, так как это было бы слишком много бесполезного шума ИМО.

Я не хочу/не могу легко добавить геттеры или сеттеры в свои DTO, так как я могу следовать этому сообщению об ошибке и настроить мой DataBinder для использования «прямого доступа к полям»? Я хотел бы использовать JavaConfig (@Configuration) для этого.

Использование использовать следующие зависимости:

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-webmvc</artifactId> 
    <version>4.3.2.RELEASE</version> 
</dependency> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator</artifactId> 
    <version>5.2.4.Final</version> 
</dependency> 

EDIT:

Контроллер:

@RequestMapping(path = "/send", method = { RequestMethod.POST, RequestMethod.PUT }) 
public void send(@Valid @RequestBody MessageDTO message) 

MessageDTO:

public class MessageDTO { 

    ... 

    @Valid 
    @NotNull 
    public ClientDTO client; 

} 

ClientDTO:

public class ClientDTO { 

    ... 

    @NotEmpty 
    public String application; 

} 
+0

По крайней мере, поля должны быть общедоступными, не так ли? вы можете ановалировать поля? – Hasson

+0

Я добавил некоторые из источников. Как вы можете видеть, они публичные. Если я удалю '@ Valid' из' MessageDTO # client', я не получу Exception, но он не будет также рекурсивно проверяться. –

ответ

5

Я просто наткнулся на ту же проблему и нашел решение для нас и просто хочу поделиться им.

Внутри Ресурса или @ControllerAdvice вы можете настроить Spring DataBinder для использования прямого доступа к полям.

@ControllerAdvice  
public class CustomControllerAdvice { 

    @InitBinder 
    private void activateDirectFieldAccess(DataBinder dataBinder) { 
     dataBinder.initDirectFieldAccess(); 
    } 

    ... 
} 
+0

Спасибо. Я буду проверять и проверять ваше предложение на следующей неделе. –

+0

Отработанные часы до того, как нашли свое решение. Спасибо чувак :) –

 Смежные вопросы

  • Нет связанных вопросов^_^