4

SpringMVCを使用して標準のJavaWebアプリケーションを開発し、最近3.0.6から3.2.0へのアップグレードを試みました。ほぼすべてのサーブレット応答はJSPまたはJsonビューですが、拡張子が「pdf」のpdfリクエストであるものもあります。

Spring 3.0.6では、SpringMVCドキュメントから取得したこの設定が行われました。

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
  <entry key="pdf" value="application/pdf"/>
  <entry key="html" value="text/html"/>
  <entry key="json" value="application/json"/>
</map>

これは、XMLViewResolverと組み合わせて正常に機能しました。

3.2.0にアップデートした後、失敗があります:

Error creating bean with name' org.springframework.web.servlet.view.ContentNegotiatingViewResolver#0' defined in class path  resource [dispatcher-test-servlet.xml]: Invocation of init method failed; nested exception is 

java.lang.ClassCastException: java.lang.String cannot be cast to                   org.springframework.http.MediaType'

ドキュメントといくつかのブログを調査した後、この構成は機能しているようです。

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
   <property name="contentNegotiationManager">
<bean class="org.springframework.web.accept.ContentNegotiationManager">
<constructor-arg>
    <list>
    <!-- These are evaluated in order -->
    <!-- Is there a media type based on suffix? -->
<bean                  class="org.springframework.web.accept.PathExtensionContentNegotiationStrategy">
<constructor-arg>
    <map>
<entry key="html" value="text/html" />
<entry key="json" value="application/json" />
<entry key="pdf" value="application/pdf" />
</map>
</constructor-arg>
</bean>
<!-- Else use request header -->
<bean
            class="org.springframework.web.accept.HeaderContentNegotiationStrategy">

</bean>
</list>
</constructor-arg>
</bean>
</property>

しかし、この構成を使用して新しいSpring MVCテストフレームワークを実行しようとしましたが、ClassCast例外が再度発生したため、テストフレームワークはアプリケーションの実行時と同じようにBeanを初期化していないようです... Spring 3,2でContentNegotiatingViewResolverを堅牢な方法で構成する方法の明確な説明はありますか?ありがとう

リチャード

4

4 に答える 4

16

春のドキュメントはそれについて警告し、契約によって一度だけ許可されているため、<mvc:annotation-driven/>xml-configurationまたは クラスからの注釈から重複を削除することで問題を修正しました 。@EnableWebMVC

于 2015-08-18T21:10:12.627 に答える
8

spring 3.2 では、 を使用してより適切に解決されContentNegotiationManagerます。それは私のために働いています。org.springframework.http.MediaType.APPLICATION_JSON_VALUEメディアタイプに言及するのと同じように静的フィールドを使用できます。次のコードを確認してください。

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="contentNegotiationManager">
            <bean class="org.springframework.web.accept.ContentNegotiationManager">
                <constructor-arg>
                    <bean class="org.springframework.web.accept.PathExtensionContentNegotiationStrategy">
                        <constructor-arg>
                            <map>
                                <entry key="json">
                                    <util:constant static-field="org.springframework.http.MediaType.APPLICATION_JSON_VALUE" />
                                </entry>
                                <entry key="xml">
                                    <util:constant static-field="org.springframework.http.MediaType.APPLICATION_XML_VALUE" />
                                </entry>
                            </map>
                        </constructor-arg>
                    </bean>
                </constructor-arg>
            </bean>
        </property>

        <property name="defaultViews">
            <list>
               <!-- default views -->
            </list>
        </property>

    </bean>

これには、dispatcher-servlet.xml ファイルで util スキーマを使用する必要があります。つまりxmlns:util="http://www.springframework.org/schema/util"、スキーマの場所 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring- util-3.0.xsd

于 2013-02-18T07:03:22.090 に答える
0

ContentNegotiationManagerFactoryBean を使用すると、同じことをより簡単に実現できると思います。デフォルトでは、最初に URL パス拡張子をチェックし、次に URL のフォーマット プロパティ (..../accounts?format=pdf など)、次に標準の HTTP Accept ヘッダー プロパティをチェックします。format パラメータの使用は、デフォルトではオフになっています。

<bean id="contentNegotiationManager"
      class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="defaultContentType" value="text/html" />

    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json" />
            <entry key="pdf" value="application/pdf" />
            <entry key="pdf" value="text/html" />
       </map>
    </property>
</bean>

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="contentNegotiationManager" ref=""/>
</bean>

JavaBeans Activation Framework (JAF) を使用する場合、mediaTypes セクションは必要ありません。クラスパスに activation.jar を置くだけです。

これを試して、クラスキャストの例外も発生しましたか?

于 2013-04-23T08:09:56.337 に答える
-1

さて、あなたが投稿したエラーは、基本的に、Spring には、指定した文字列 (たとえば、「application/pdf」) を MediaType オブジェクトに変換する方法がないことを示しています。ContentNegotiatingViewResolver が mediaTypes マップを Map to a Map に変更したと推測しています。次のようなことを試すことができます:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
  <entry key="pdf">
    <value>
      <bean class="org.springframework.http.MediaType">
        <constructor-arg value="application/pdf" />
      </bean>
    </value>
  </entry>
  <entry key="html">
    <value>
      <bean class="org.springframework.http.MediaType">
        <constructor-arg value="text/html" />
      </bean>
    </value>
  </entry>
  <entry key="json">
    <value>
      <bean class="org.springframework.http.MediaType">
        <constructor-arg value="application/json" />
      </bean>
    </value>
  </entry>
</map>
</bean>

注:これは記憶から行ったので、タイプミスしている可能性があります。基本的に、エントリの値は文字列ではなく MediaType である必要があります。

于 2013-02-01T19:55:43.950 に答える