2012-11-02 147 views
1

我們希望從我們的控制器中提供替代的PDF視圖以及常規的JSP視圖,並添加了ContentNegotiatingViewResolverXmlViewResolver來處理此問題。 我發現的所有示例(包括Spring文檔)都返回一個簡單的視圖名稱,XmlViewResolver將其映射到其views.xml文件(在我們的示例中,將PDF寫入HttpResponse)中的bean ID。spring MVC XmlViewResolver配置

但是,我們將我們的jsps組織在我們的InternalResourceViewResolver中定義的位置的子文件夾中。

例如,

<bean id="viewResolver" class= "org.springframework.web.servlet.view.InternalResourceViewResolver" p:order="2">   
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
    <property name="prefix" value="/WEB-INF/pages/"/> 
    <property name="suffix" value=".jsp"/> 
</bean> 

所以,從我們的控制器中,我們返回視圖名稱,如 「A/B/C」 的JSP是在/ WEB-INF /頁/ A/B/C。 JSP。

這適用於JSP,但不能在views.xml中定義爲'a/b/c'的bean id;它不是有效的bean ID。 我們已經調查了,要麼不工作不理想幾種選擇:

  1. 把所有的JSP在一個文件夾中,這樣我們就可以使用,可以解決一個bean-ID命名兼容視圖名稱通過XmlViewResolver。這可行,但對組織我們的JSP並不理想。
  2. 有多個使用不同前綴的InternalResourceViewResolver定義。這只是不行;如果該類型的第一個解析器無法找到匹配的視圖,則它不會返回null,它只會失敗併產生異常,並且不會使用後續的ViewResolvers
  3. 使用單獨的控制器方法(或控制器中的條件代碼,根據請求的內容類型或URL後綴返回視圖名稱);這些解決方案似乎失敗了保持對其意見不知情的目的。
  4. 嘗試在XmlViewResolver的location屬性中使用通配符;這失敗了,但有一個例外。

我敢肯定,有一個很好的優雅的解決方案,但它正在逃避我剛纔。有沒有更好的方法,我可以返回一個視圖名稱,如'a/b/c',它有可能被XmlViewResolver解析?

謝謝你的任何建議。

理查德

回答

1

當然,豆別名是要走的路...有點四處之後:

在由XmlViewResolver針對性的views.xml文件:

<bean id="PdfView" class="com.blah.PdfDocView" /> 
<alias name="PdfView" alias="https://stackoverflow.com/a/b/structuredDocument"/> 

它將'/ a/b/structuredDocument'映射到PdfDocView bean。

+0

你應該選擇你的答案作爲正確的答案。 – Paul