Как настроить прямой доступ к полю на @Valid в Spring? - PullRequest
0 голосов
/ 10 января 2019

Как я могу сказать spring-web для проверки моего dto без использования getter / setter?

@PostMapping(path = "/test")
public void test(@Valid @RequestBody WebDTO dto) {

}

public class WebDTO {
   @Valid //triggers nested validation
   private List<Person> persons;

   //getter+setter for person

   @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
   public static class Person {
         @NotBlank
         public String name;
         public int age;
   }
}

Результат:

"java.lang.IllegalStateException","message":"JSR-303 validated property 
    'persons[0].name' does not have a corresponding accessor for Spring data 
    binding - check your DataBinder's configuration (bean property versus direct field access)"}

Специальное требование: я все еще хочу добавить @AssertTrue на логические геттеры, чтобы обеспечить межполевую проверку, например:

    @AssertTrue
    @XmlTransient
    @JsonIgnore
    public boolean isNameValid() {
        //...
    }

Ответы [ 2 ]

0 голосов
/ 07 августа 2019

Попробуйте что-то вроде этого:

@Access(AccessType.FIELD)
public String name;
0 голосов
/ 10 января 2019

необходимо настроить Spring DataBinder для использования прямого доступа к полю.

@ControllerAdvice    
public class ControllerAdviceConfiguration {
    @InitBinder
    private void initDirectFieldAccess(DataBinder dataBinder) {
        dataBinder.initDirectFieldAccess();
    }
}
...