我正在开发一个使用Spring MVC和Thymeleaf作为我的ViewResolver的Web应用程序。我有以下控制器处理程序方法:
@RequestMapping(value = "/something", method = RequestMethod.POST, params = "submit")
public String doSomething(@ModelAttribute("error") String error /*, other attributes */) {
// find out if there is an error
error = getErrorMessage();
return "someHTMLfile";
}
我的观点包含以下一行:
<p><span th:text="${error}">Error Message goes here</span></p>
执行时,标记不会呈现任何内容。这可能是由于${error}
评估为空字符串,但我无法理解为什么。 Spring的@ModelAttribute
注释是否会自动将对象添加到模型图中,Thymeleaf可以在哪里找到它?
如果我改为:
@RequestMapping(value = "/something", method = RequestMethod.POST, params = "submit")
public String doSomething(ModelMap map /*, other attributes */) {
// find out if there is an error
String error;
error = getErrorMessage();
map.addAttribute("error", error);
return "someHTMLfile";
}
使用错误消息可以很好地呈现视图。 @ModelAttribute是否不将对象添加到请求模型中?
编辑:我尝试过这两种方式:
@RequestMapping(value = "/something", method = RequestMethod.POST, params = "submit")
public String doSomething(@ModelAttribute("error") String error, ModelMap map /*, other attributes */) {
// find out if there is an error
error = getErrorMessage();
map.addAttribute("error", error);
return "someHTMLfile";
}
这也行不通。
答案 0 :(得分:0)
其实我不认为你的问题与Thymeleaf有关,只是SpringMVC: - )
在您的第一个代码段中,您不会向请求模型添加任何内容,而是尝试从表单中返回一个名为“error”的对象。
在您的第二个片段中,您确实向模型添加了一个对象,这就是您的视图渲染得很好的原因。
查看SpringMVC doc here(16.3.3.8)以更好地理解方法参数的@ModelAttribute注释。
答案 1 :(得分:0)
我感到愚蠢,但无论如何,我们都会犯错误。
Spring正在为我创建一个新的String
实例,并将其注入我的方法并注入密钥error
下的模型中。 String是一个不可变对象,所以当我error = getErrorMessage()
时,我将另一个实例分配给我的error
对象。现在,我的error
和Spring模型中的错误String
的值为""
。这就是Thymeleaf渲染只找到空字符串的原因。