0

Spring 3.1 アプリケーションは、次の方法でメッセージ コンバーターを使用します。

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
     ....
     ....
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="writeAcceptCharset" value="false"/>
            </bean>
            <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.feed.AtomFeedHttpMessageConverter"/>
        </list>
    </property>
</bean>
<bean class="org.codehaus.jackson.map.ObjectMapper" name="objectMapper"/>

私のコントローラーの1つに、次のようなRequestMappingがあります。

@RequestMapping(value = "pathFoo", produces = MediaType.APPLICATION_ATOM_XML_VALUE)
public @ResponseBody Feed getFooAtomXML(HttpServletRequest request, HttpServletResponse response){

しかし、リクエスト ヘッダー Accept=application/atom+xml を指定しない限り、レスポンスは XML ではなく JSON として返されるようです。リクエストヘッダーが存在するかどうかに関係なく、このマッピングで AtomFeedHttpMessageConverter が使用されるようにアプリケーションを構成するにはどうすればよいですか?

ViewResolver に頼る必要がありますか?

4

1 に答える 1

3

ここでの問題は、 Bean が宣言された順序AnnotationMethodHandlerAdapterで Bean のリストを通過することです。HttpMessageConverter

canWrite(Class, MediaType)最初にそれぞれのメソッドを呼び出し、HttpMessageConverter最初に返されたメソッドを使用しますtrue

Acceptヘッダーを として提供しないとapplication/atom+xml、がチャンスを得る前に が最初にMappingJacksonHttpMessageConverter返されます。これには 2 つの理由があります。trueAtomFeedHttpMessageConverter

  1. ヘッダーが提供されない場合Accept、Spring はすべてMediaTypeの s を受け入れ可能と見なします。
  2. MappingJacksonHttpMessageConverterapplication/jsonコンテンツタイプを受け入れます

これは、MappingJacksonHttpMessageConverter次のように実装されているためです。

@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
    return (this.objectMapper.canSerialize(clazz) && canWrite(mediaType));
         // ^ will pretty much always return true    ^ application/json
}

したがって、受け入れ可能なメディア タイプにはすべてが含まれるMappingJacksonHttpMessageConverterため、 は応答を生成することができ、Spring はそれを選択します。

これを変更するには、Bean の順序を変更します

<property name="messageConverters">
    <list>
        <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <property name="writeAcceptCharset" value="false"/>
        </bean>
        <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.feed.AtomFeedHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
    </list>
</property>

またはAccept、HTTP 仕様で指定されているヘッダーを指定します。

または、 (非推奨)RequestMappingHandlerAdapterの代わりに使用する Spring 3.2 に移行しますが、デフォルトで の前にも登録します。AnnotationMethodHandlerAdapterAtomFeedHttpMessageConverterMappingJacksonHttpMessageConverter

于 2013-10-16T19:55:14.213 に答える