8

我用一些 JSR-303 验证器注释制作了一个模型对象:

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 对象的 Object:

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 注释不像JSR 303:Bean Validation所说的那样递归地工作。谁能给我一个解决方案,以便我可以递归地验证我的对象,非常感谢!!!!

4

2 回答 2

6

我从来没有做过递归验证,但根据这个,只需用@Valid 标记子对象就可以了。

于 2013-02-18T16:52:57.100 回答
0

我的两分钱:

1.尝试使用 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}" /> 
于 2013-04-29T10:17:48.857 回答