Spring注释@ModelAttribute和@Valid

Spring注释@ModelAttribute和@Valid,spring,spring-mvc,spring-data,spring-annotations,Spring,Spring Mvc,Spring Data,Spring Annotations,使用@modeldattribute和@Valid的优点是什么 有什么不同 可以同时使用它们吗?@modeldattribute用于将方法参数或方法返回类型映射/绑定到命名的模型属性。请参阅JavaDoc。这是一个Spring注释 @Valid是标记对象的注释。请参阅JavaDoc。它是JavaEE6的一部分,但我认为Hibernate有一个大多数人使用的早期实现 使用@modeldattribute的优点是可以将表单的输入映射到bean。@Valid的优点是,您可以利用JSR-303bean验

使用
@modeldattribute
@Valid
的优点是什么

有什么不同


可以同时使用它们吗?

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

@Valid
是标记对象的注释。请参阅JavaDoc。它是JavaEE6的一部分,但我认为Hibernate有一个大多数人使用的早期实现

使用
@modeldattribute
的优点是可以将表单的输入映射到bean。
@Valid
的优点是,您可以利用JSR-303bean验证来确保所生成的bean是根据一组规则进行验证的

是的,您可以同时使用
@modeldattribute
@Valid

将数据从表单(sic视图)传输到模型对象的最佳方式是使用Spring遵循典型/传统的MVC设计模式。我个人更喜欢的方式是在JSP中使用SpringJSTL
标记和
modelAttribute
集创建一个表单。在控制器上,让一个处理程序从具有匹配的
@modeldattribute
的表单接受POST,该bean表示表单的输入。然后,我将把“表单Bean”传递给服务层来做一些事情,包括在需要时将“表单Bean”转换为任何模型(如果表单直接创建模型对象,则不需要),以及通过DAO保存/更新/等等。这只是做事的一种方式,但它可能是我在日常工作中使用Spring所做的大部分工作

我强烈建议阅读Spring参考资料并遵循教程。参考资料写得很好,很容易理解,并且包含了很多关于你在Spring中做事的各种方式的例子,而且通常有很多关于你在Spring中做事的选项。

请检查以下部分:

除了数据绑定之外,您还可以使用自己的自定义验证器调用验证,并传递用于记录数据绑定错误的相同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";
    }

    // ...

}

请试着问一个问题。我应该注意,我工作的地方没有使用
@Valid
,因为我们没有将表单错误放在视图中的控件旁边(我们将表单验证错误放在列表的顶部),并且您无法控制JSR-303验证错误发生的顺序。这个决定是在我开始在这里工作前几年做出的,所以我不是其中的一员。我个人更喜欢JSR-303验证,因为它易于使用。首先,非常感谢。我正在寻找一个代码片段,它展示了如何正确使用这个特性。现在,在我的项目中,我指的是这个例子(),但它只使用@Valid@vdenotaris,这个例子中的
@modeldattribute
是隐含的。好像它就在那里。查看
HandlerMethodArgumentResolver
。为方便起见,这里是用于JSR-303验证的Spring 4参考资料。非常值得一读:在这种情况下,Pet类的属性必须根据JSR-303规范进行注释,对吗?是的,您可以在spring参考链接中查看完整的示例