【问题标题】:Spring annotations @ModelAttribute and @ValidSpring注解@ModelAttribute和@Valid
【发布时间】:2014-05-04 17:05:25
【问题描述】:

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

有什么区别?

可以一起使用吗?

【问题讨论】:

  • 请尝试提出一个问题。

标签: spring spring-mvc spring-data spring-annotations


【解决方案1】:

请查看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";
    }

    // ...

}

【讨论】:

【解决方案2】:

@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 验证,因为它易于使用。
  • 首先,非常感谢。我正在寻找一个代码-sn-p,它显示如何正确使用此功能。现在,在我的项目中,我指的是这个例子(spring.io/guides/gs/validating-form-input),但它只使用了@Valid。
  • @vdenotaris 该示例中的@ModelAttribute 是隐含的。就好像它就在那里一样。查看HandlerMethodArgumentResolver
  • 为方便起见,这里是 JSR-303 验证的 Spring 4 参考资料。非常值得一读:docs.spring.io/spring/docs/4.0.2.RELEASE/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 2020-11-26
  • 2018-07-14
  • 2011-04-05
相关资源
最近更新 更多