Spring注释@ModelAttribute和@Valid

vde*_*ris 9 spring spring-mvc spring-annotations spring-data

使用@ModelAttribute和有@Valid什么好处?

哪些是差异?

可以一起使用它们吗?

Cod*_*imp 16

@ModelAttribute用于将方法参数或方法返回类型映射/绑定到命名的模型属性.请参阅@ModelAttribute的JavaDoc.这是一个Spring注释.

@Valid是一个注释,标记JSR-303 bean验证的对象.请参阅@Valid的JavaDoc.它是JavaEE 6的一部分,但我认为Hibernate有一个早期的实现,大多数人都使用它.

使用的优点@ModelAttribute是您可以将表单的输入映射到bean.优点@Valid是您可以利用JSR-303 bean验证来确保根据某些规则验证所生成的bean.

是的,你可以使用@ModelAttribute@Valid在一起.

将数据从表单(sic View)传输到Model对象的最佳方法是使用Spring遵循典型/传统的MVC设计模式.我个人首选的方法是在带有Spring JSTL <form:*>标记的JSP中使用一个表单modelAttribute.在Controller上,有一个处理程序来接受来自表单的POST,该表单的匹配@ModelAttribute是表示表单输入的bean.然后我会将"Form Bean"传递给服务层来做一些事情,包括在需要时将"Form Bean"翻译成任何模型(如果表单直接创建模型对象则不需要)以及保存/更新/ etc一个DAO.这只是一种做事的方式,但这可能是我在日常工作中使用Spring做的大部分工作.

强烈建议您阅读Spring参考资料并按照教程进行操作.参考资料写得很好,易于理解,并且包含了很多关于Spring中可以做的事情的例子,而且在Spring中你通常会有很多选择.

  • 我应该注意,我们在我工作的地方不使用 `@Valid`,因为我们没有将表单错误放在视图中的控件旁边(我们将表单验证错误放在列表的顶部),并且您无法控制顺序发生 JSR-303 验证错误的原因。这个决定是在我开始在这里工作前几年做出的,所以我没有参与其中。我个人更喜欢 JSR-303 验证,因为它易于使用。 (2认同)

Bas*_*hdy 9

请查看以下部分的弹簧参考文档:

除了数据绑定之外,您还可以使用自己的自定义验证程序调用验证,该验证程序传递用于记录数据绑定错误的相同BindingResult.这允许数据绑定和验证错误在一个地方累积,然后报告给用户:

@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result) {
    new PetValidator().validate(pet, result);
    if (result.hasErrors()) {
    return "petForm";
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过添加JSR-303 @Valid注释自动调用验证:

@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@Valid @ModelAttribute("pet") Pet pet, BindingResult result)             {
    if (result.hasErrors()) {
        return "petForm";
    }

    // ...

}
Run Code Online (Sandbox Code Playgroud)

  • 是的,您可以查看弹簧参考链接中的完整示例http://docs.spring.io/spring/docs/4.0.3.RELEASE/spring-framework-reference/htmlsingle/#mvc-ann-modelattrib-method-args (2认同)