3

たとえば、REST スタイルのコントローラー マッピングがあるとします。

@RequestMapping(value="users", produces = {MediaType.APPLICATION_JSON_VALUE})
public List<User> listUsers(@ReqestParams Integer offset, @ReqestParams Integer limit, @ReqestParams String query) {
    return service.loadUsers(query, offset, limit);
}

JSON (または XML) の提供は問題ではありません。ContentNegotation と MessageConverters を使用すると簡単です。

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="true" />
    <property name="favorParameter" value="false" />
    <property name="ignoreAcceptHeader" value="false" />
    <property name="mediaTypes" >
        <value>
            html=text/html
            json=application/json
            xml=application/xml
        </value>
    </property>
</bean>

ここで、PDF のサポートを追加する必要があります。当然、(Spring) MVC + REST をできるだけ使いたい。私が見つけたほとんどの例は、REST スタイルを使用しない明示的な定義でこれを実装しています。

@RequestMapping(value="users", produces = {"application/pdf"})
public ModelAndView listUsersAsPdf(@ReqestParams Integer offset, @ReqestParams Integer limit, @ReqestParams String query) {
    List<User> users = listUsers(offset, limit, query); // delegated
    return new ModelAndView("pdfView", users);
}

これは機能しますが、代替出力 (PDF、Excel など) ごとにリクエスト マッピングを追加するため、あまり快適ではありません。

application/pdfコンテンツ ネゴシエーション リゾルバーには既に追加しています。残念ながら、接尾辞.pdfまたは Accept-Headerapplication/pdfを含むリクエストには406.

PDF などの代替出力を統合するための REST/MVC スタイル パターンの理想的な設定は何ですか?

4

3 に答える 3

0

これは動作サンプルです。このために contentnegotiationviewresolver を構成し、最高の順序を指定します。その後、JSTL と Tiles View 用の ResourceBundleViewResolver と、excelResolver、pdfResolver、rtfResolver 用の XmlViewResolver があります。ExcelResolver、pdfResolver、rtfResolver。XmlViewResolver と ResourceBundleViewResolver は MAV でのみ機能しますが、MappingJacksonJsonView と MarshallingView は MAV と @ResponseBody の両方の戻り値を処理します。

<bean id="contentNegotiatingResolver" class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order"
                  value="#{T(org.springframework.core.Ordered).HIGHEST_PRECEDENCE}" />
<property name="mediaTypes">
            <map>
                <entry key="json" value="application/json" />
                <entry key="xml" value="application/xml" />
                <entry key="pdf" value="application/pdf" />
                <entry key="xlsx" value="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
                <entry key="doc" value="application/msword" />
            </map>
        </property>

        <property name="defaultViews">
            <list>
                <!-- JSON View -->
                <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />

                <!-- XML View -->
                <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                        <constructor-arg>
                            <bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
                            <property name="classesToBeBound">
                            <list>
                                <value>Employee</value>
                                <value>EmployeeList</value>
                            </list>
                            </property>
                            </bean>
                        </constructor-arg>
            </bean>
            </list>
        </property>
        <property name="ignoreAcceptHeader" value="true" />
 </bean>
<bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver"
        id="resourceBundleResolver">
        <property name="order" value="#{contentNegotiatingResolver.order+1}" />
    </bean>
<bean id="excelResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
       <property name="location">
           <value>/WEB-INF/tiles/spring-excel-views.xml</value>
       </property>
       <property name="order" value="#{resourceBundleResolver.order+1}" />
    </bean>

    <bean id="pdfResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
       <property name="location">
           <value>/WEB-INF/tiles/spring-pdf-views.xml</value>
       </property>
       <property name="order" value="#{excelResolver.order+1}" />
    </bean>

    <bean id="rtfResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
       <property name="location">
           <value>/WEB-INF/tiles/spring-rtf-views.xml</value>
       </property>
       <property name="order" value="#{excelResolver.order+1}" />
    </bean>

XMLViewResolver spring-pdf-views.xml は次のようになります。

<bean id="employees"
        class="EmployeePDFView"/>

また、EmployeePDFView には、pdf を生成し、Response オブジェクトに pdf バイト ストリームを書き込むためのコードが含まれます。これは、.pdf 拡張子で終わる残りの URL に解決され、「employees」ID で MAV を返すときに解決されます。

于 2014-03-07T15:01:14.767 に答える