5

我做一個模型對象與一些JSR-303驗證註釋:可以@Valid註釋檢查字段在春季MVC遞歸?

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

自動數據綁定它在一個控制器:

@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... 
    } 
} 

在上述情況下,它的驗證工作正常。但是,當我封裝模式到另一個對象,就像下面,對UserInfoBasicModel驗證不工作了:

封裝了UserInfoBasicModel對象的對象:

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

控制器:

@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... 
    } 
} 

我想知道爲什麼@valid annotaion不能遞歸工作,就像JSR 303: Bean Validation說的那樣。任何人都可以給我一個解決方案,這樣我就可以遞歸地驗證我的對象,非常感謝!

+0

也許第二有效可以省略?第一個Valid應該在整個模型中級聯。 – tstorms 2013-02-18 15:38:28

+0

我正在做一些與Spring 3.2.4.RELEASE非常相似的東西,並且在'UserUpdateFormTransmitter'中爲我的'userInfoBasicModel'添加'@ Valid'使其對我有效。沒有它,嵌套驗證被忽略。 – 2014-02-18 03:28:14

回答

3

我從來沒有做過遞歸驗證,但根據this它可能只需使用@Valid標記子對象。

0

我的兩分錢:

1.Try使用的ModelAttribute象下面這樣:

的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.確保您使用路徑屬性,如

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

代替

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