2011-02-04 19 views
5

我正在使用Velocity和Spring。在Spring中,我使用VelocityViewResolverContentNegotiatingViewResolver配對。在大多數情況下,這很有用。唯一的問題是ContentNegotiatingViewResolverVelocityViewResolver查詢許多不同的內容集(它應該)。如何關閉Spring中的VelocityViewResolver錯誤?

當速度發動機沒有找到特定的模板,產生一個錯誤類似於以下:

2011-02-04 13:37:15074 ERROR [HTTP-8080-2] VelocityEngine :ResourceManager:無法在任何資源加載器中找到資源「foo.json.vm」。

這並不理想。理想情況下,如果找不到模板,則會生成警告或類似的內容。如果某個特定內容類型的模板不存在,我真的不在意......因爲這意味着內容類型不支持通過該視圖解析器。

有關如何通過VelocityViewResolver,VelocityViewContentNegotiatingViewResolver來抑制此錯誤的任何想法?

+2

VelocityViewResolver javadoc說:「當鏈接ViewResolver時,VelocityViewResolver總是需要最後一個,因爲它會嘗試解析任何視圖名稱,而不管底層資源是否真的存在」。也許你可以繼承VelocityViewResolver並覆蓋buildView(String viewName),這樣你就可以檢查視圖是否存在,如果不存在,那麼你可以將viewName更改爲「未找到」vm視圖名稱並調用super.buildView(viewName)。這只是一個想法,如果它有幫助。 – Javi 2011-02-04 20:03:32

回答

2

所以,我發現最好的方法是將logger語句添加到我的日誌配置文件中,專門用於Velocity引擎(Velocity和我的項目都使用Commons日誌記錄)。我的記錄聲明是這樣的:

<logger name="org.apache.velocity.app"> 
    <level value="OFF" /> 
</logger> 
1

這是因爲你的ContentNegotiatingViewResolver使用VelocityViewResolver。你可以通過給它一個空的(但非空的)視圖解析器列表來阻止它的實現。

<bean 
    class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    ... 
    <property name="viewResolvers"> 
      <list /> 
    </property> 
</bean> 
1

該問題將在Spring 3.2中修復,請參閱SPR-8640。在此改進之後,您將能夠配置Velocity視圖解析器來僅檢查一次未解析的視圖。