2013-01-06 117 views
1

我正在開發一個Web應用程序與Spring MVC和Thymeleaf作爲我的ViewResolver。我有以下控制器處理方法:春天MVC和thymeleaf ModelAttribute爲null或未評估

@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

我覺得很愚蠢,但無論如何,我們都會犯錯誤。

Spring正在爲我創建一個新的String實例,並將其注入到我的方法中,並將其注入到模型error下。字符串是不可變的對象,所以當我做error = getErrorMessage()時,我將另一個實例指定給我的error對象。現在,我的error和錯誤String在春季模型中的值爲""。這就是爲什麼Thymeleaf渲染只能找到空字符串。

0

其實我不認爲你的問題涉及到Thymeleaf,用Sp​​ringMVC只是:-)

在你的第一個片段,你不添加任何請求模式,而是試圖讓調用的對象「錯誤「從形式回來。

在你的第二個片段中,你添加了一個對象到模型中,這就是爲什麼你的視圖被很好的渲染。

查看SpringMVC doc here(16.3.3.8),以更好地理解方法參數上的@ModelAttribute註釋。

+0

'方法參數上的@ModelAttribute指示參數應該從模型中檢索。如果模型中不存在,則應首先實例化參數,然後將其添加到模型中。' –

+0

原來我們都錯了,ModelAttribute的確按照我的想法做了。我很慚愧地說這是一個Java問題。看到我的答案。 –