Spring MVC和thymeleaf ModelAttribute为null或未评估

时间:2013-01-06 06:38:41

标签: java html spring-mvc thymeleaf

我正在开发一个使用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";
}

这也行不通。

2 个答案:

答案 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渲染只找到空字符串的原因。