【问题标题】:can @Valid annotation check on fields recursively in spring mvc?@Valid 注释可以在 spring mvc 中递归地检查字段吗?
【发布时间】:2013-02-16 10:39:10
【问题描述】:

我用一些 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 所说的那样递归地工作。谁能给我一个解决方案,以便我可以递归地验证我的对象,非常感谢!!!!

【问题讨论】:

  • 也许第二个valid可以省略?第一个 Valid 应该级联整个模型。
  • 我正在做一些与 Spring 3.2.4.RELEASE 非常相似的事情,并将 @Valid 添加到我的等价物 userInfoBasicModelUserUpdateFormTransmitter 让它为我工作。没有它,嵌套验证将被忽略。

标签: validation spring-mvc bean-validation hibernate-validator


【解决方案1】:

我从未做过递归验证,但根据this,只需使用@Valid 标记子对象即可。

【讨论】:

  • 它就是这样工作的,但这是一个非常便宜的解决方法,我也不喜欢它。
【解决方案2】:

我的两分钱:

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}" /> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-15
    • 2015-01-15
    • 2011-12-02
    • 2016-02-05
    • 1970-01-01
    • 2020-12-15
    • 2017-10-01
    • 2019-07-13
    相关资源
    最近更新 更多