具有@ModelAttribute的变量是否从请求参数中填充?

时间:2018-08-23 16:59:20

标签: spring spring-mvc modelattribute

我对Spring @ModelAttribute在方法参数方面的工作很感兴趣。

我们知道,当模型中不存在所请求的属性时,就会创建其实例并从视图表单中填充它。

我的问题与以下情况有关:表单没有预期的属性,但是URL模板参数中有可用的属性。 我想知道在这种情况下我们的变量是否将使用那些请求参数的值填充?

例如,在这里,是否可以从URL http://localhost:8080/MyApp/parameter1=whatever?parameter2=whatever?parameter3=whatever中用参数1,2,3填充变量attributeToPopulate?:

RequestMapping(method = RequestMethod.GET)
public  String fooMethod(@ModelAttribute("attributeName") FooClass attributeToPopulate){
// method implementation
return "view";
}

Spring文档,参考文档和Q&A站点均未明确提及此类情况。但是,此处的one post确实提到了用ModelAtrribute注释的变量是以这种方式填充的(用户 Xelian 的答案):

name="Dmitrij"&countries=Lesoto&sponsor.organization="SilkRoad"&authorizedFunds=&authorizedHours=&

考虑到该答案的少数支持,我有些怀疑,但同时也对@ModelAttribute是否确实以这种方式起作用感到好奇。

任何信息输入将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以为FooClass中的字段设置默认值,而不是在RequestMapping批注中设置默认值。在这种情况下,您将不必在使用RequestMapping作为FooClass的所有方法中使用默认值复制粘贴ModelAttribute。 @tomatefraiche我试图通过

来做到这一点
<spring:url value="/hello?name=default" var="userActionUrl" />
<form:form method="get" modelAttribute="user" action="${userActionUrl}">
  <form:input path="name" type="text" disabled="true" />
</form:form>

@GetMapping("/hello")   
  public String hello(@ModelAttribute("user") User user, Model model) {
  model.addAttribute("name", user.name);
  model.addAttribute("user", user);
  return "hello";

}

,看起来像Spring在URL中覆盖值。控制器中有一个空值。提交表单后,URL也为hello?name=。看来您无法通过url设置默认值,因为它将被替换。