5

robię obiekt modelu z pewnym JSR-303 weryfikatorów adnotacji:Czy @ Valid sprawdzanie adnotacji pól rekursywnie w Spring MVC?

public class UserInfoBasicModel implements Serializable{ 
    @NotNull(message="cannot be null") 
    @NotEmpty(message="cannot be empty") 
    private String name; 
    //getter and setter 
    //..ignored.. 
} 

Auto dane wiążące go w kontrolerze:

@Controller 
@RequestMapping("/user") 
public class UserController { 
    @RequestMapping(method = RequestMethod.POST, value = "/registry/") 
    public String registry(HttpServletRequest request, 
      ModelMap modelMap, 
      @Valid UserInfoBasicModel userInfoBasicModel, 
      BindingResult result) { 
     //...some code here... 
    } 
} 

W powyższym scenariuszu, to działa dobrze dla walidacji. Ale kiedy enkapsulacji modelu do innego obiektu, tak jak poniżej, walidację na UserInfoBasicModel już nie działa:

obiektu, który obudowuje obiekt UserInfoBasicModel:

public static class UserUpdateFormTransmitter  { 
    @Valid 
    private UserInfoBasicModel userInfoBasicModel; 
    //getter and setter 
    //..ignored.. 
} 

kontroler:

@Controller 
@RequestMapping("/user") 
public class UserController { 
    @RequestMapping(method = RequestMethod.POST, value = "/registry/") 
    public String registry(HttpServletRequest request, 
      ModelMap modelMap, 
      @Valid UserUpdateFormTransmitter userUpdateFormTransmitter, 
      BindingResult result) { 
     //...some code here... 
    } 
} 

Zastanawiam się, dlaczego @valid annotaion nie działa rekurencyjnie tak jak to, co mówi JSR 303: Bean Validation. Czy ktoś może mi dać rozwiązanie, które pozwoli rekurencyjnie uprawomocnić mój obiekt, bardzo dziękuję !!!!

+0

Może drugi ważny można pominąć? Pierwszy poprawny powinien kaskadować się przez cały model. – tstorms

+0

Robię coś bardzo podobnego do Spring 3.2.4.RELEASE, i dodanie '@ Valid' do mojego odpowiednika do' userInfoBasicModel' w 'UserUpdateFormTransmitter' sprawiło, że działało to dla mnie. Bez tego sprawdzanie zagnieżdżone zostało zignorowane. –

Odpowiedz

3

Nigdy nie przeprowadzałem rekurencyjnego sprawdzania poprawności, ale zgodnie z this jest to możliwe po prostu przez oznaczenie pod-obiektów przez @Valid.

0

Moje dwa centy:

1.Try użyciu ModelAttribute jak poniżej:

plików Java:

@RequestMapping(method = RequestMethod.POST, value = "/registry/") 
public String registry(HttpServletRequest request, 
      ModelMap modelMap, 
      @ModelAttribute("userupdate") @Valid UserUpdateFormTransmitter userUpdateFormTransmitter, 
      BindingResult result) 

JSP:

<form:form method="POST" name="form1" action="/registry" modelAttribute="userupdate"> 

2.Upewnij używanego atrybut ścieżki, taki jak

//for recursive access 
<form:input type="text" id="name" path="userInfoBasicModel.name" /> 

zamiast

<form:input type="text" id="name" value="${userInfoBasicModel.name}" />