【发布时间】:2014-05-04 17:05:25
【问题描述】:
使用@ModelAttribute和@Valid有什么好处?
有什么区别?
可以一起使用吗?
【问题讨论】:
-
请尝试提出一个问题。
标签: spring spring-mvc spring-data spring-annotations
使用@ModelAttribute和@Valid有什么好处?
有什么区别?
可以一起使用吗?
【问题讨论】:
标签: spring spring-mvc spring-data spring-annotations
请查看spring reference documentation以下部分:
除了数据绑定之外,您还可以使用自己的自定义验证器调用验证,传递用于记录数据绑定错误的相同 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";
}
// ...
}
或者您可以通过添加 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";
}
// ...
}
【讨论】:
@ModelAttribute 用于将方法参数或方法返回类型映射/绑定到命名模型属性。请参阅@ModelAttributes JavaDoc。这是一个 Spring 注解。
@Valid 是为JSR-303 bean validation 标记对象的注释。请参阅@Valids JavaDoc。它是 JavaEE 6 的一部分,但我认为 Hibernate 有一个大多数人使用的早期实现。
使用@ModelAttribute 的优点是您可以将表单的输入映射到bean。 @Valid 的优点是您可以利用 JSR-303 bean 验证来确保生成的 bean 已根据某些规则集进行验证。
是的,您可以同时使用@ModelAttribute 和@Valid。
将数据从表单(原文如此视图)传输到模型对象的最佳方式是使用 Spring 遵循典型/传统的 MVC 设计模式。我个人首选的方式是在带有 Spring JSTL <form:*> 标记的 JSP 中创建一个表单,并设置 modelAttribute。在控制器上,有一个处理程序来接受来自表单的 POST,该表单具有匹配的@ModelAttribute,这是一个代表表单输入的 bean。然后,我会将“Form Bean”传递给服务层来做一些事情,包括在需要时将“Form Bean”转换为任何模型(如果表单直接创建模型对象则不需要)并通过保存/更新/等一个 DAO。这只是做事的一种方式,但它可能是我在日常工作中使用 Spring 所做的大部分工作。
我会强烈推荐阅读 Spring 参考资料并遵循教程。参考资料写得非常好,易于理解,并且包含大量关于在 Spring 中执行操作的各种方式的示例,并且通常有很多关于如何在 Spring 中执行操作的选项。
【讨论】:
@Valid,因为我们不会将表单错误放在我们视图中的控件旁边(我们将表单验证错误放在列表的顶部) ,并且您无法控制 JSR-303 验证错误发生的顺序。这个决定是在我开始在这里工作几年前做出的,所以我没有参与其中。我个人更喜欢 JSR-303 验证,因为它易于使用。
@ModelAttribute 是隐含的。就好像它就在那里一样。查看HandlerMethodArgumentResolver。