带有@ModelAttribute 的变量是否从请求参数中获取?

Does a variable with @ModelAttribute get populated from request parameters?

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

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

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

例如,像这里一样,变量 attributeToPopulate 是否会使用 URL http://localhost:8080/MyApp/parameter1=whatever?parameter2=whatever?parameter3=whatever 中的参数 1、2、3 填充?:

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

Spring 文档、参考文档和问答网站均未明确提及此类情况。但是,Stack Overflow 上的 one post 确实提到用 ModelAtribute 注释的变量以这种方式填充(用户 Xelian 的回答):

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

考虑到对该答案的少量赞成票,我有点怀疑,但同时对@ModelAttribute 是否确实以这种方式起作用感到好奇。

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

您可以为 FooClass 中的字段设置默认值,而不是在 RequestMapping 注释中设置它们。在这种情况下,您不必在将 FooClass 用作 ModelAttribute 的所有方法中使用默认值复制粘贴 RequestMapping。 @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 设置默认值,因为它将被替换。