2016-12-08 8 views
5

他のよく似た質問をしましたが、何も私のために働いていません。デフォルトによる応答として春mvc:xmlからjsonへの既定応答形式の変更

すべての私のAPIの戻りJSONに:ので、いくつかのXML APIの

は、私はなし」はデフォルトで今すぐをジャクソン-XML

<dependency> 
    <groupId>com.fasterxml.jackson.dataformat</groupId> 
    <artifactId>jackson-dataformat-xml</artifactId> 
    </dependency> 

を追加する必要がありましたすべての応答はXMLです。

デフォルトのレスポンス形式です。

ここドキュメントに記載されているように:

https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc

私は、次の設定を実装:

@Override 
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { 
     configurer.favorPathExtension(false).favorParameter(true).parameterName("mediaType").ignoreAcceptHeader(true)  
       .useJaf(false).defaultContentType(MediaType.APPLICATION_JSON) 
       .mediaType("xml", MediaType.APPLICATION_XML).mediaType("json", MediaType.APPLICATION_JSON); 
    } 

ケース1:私はignoreAcceptHeader(true)を作るならば、すべてがJSONであってもXML JSONを返すAPI。

ケース2:の場合、ignoreAcceptHeader(false)のデフォルト値はXMLです。私はこのように私のAPIの外観言及するのを忘れ

@RequestMapping(value = "/getXml", method = RequestMethod.GET) 
public ResponseEntity<String> getXml(HttpServletRequest request) 
     throws JAXBException { 
    return returnXml(); 
} 

を私はかなり私が欲しいのは(AcceptHeaderなし)デフォルトはJSONであるべきで、ここでは失われています。 (APIはStringとしてXMLを返します)

Accept Header: "Application/xml"が定義されている場合、応答はXMLでなければなりません。

アドバイスは非常に役に立ちます。

ありがとうございました。

+2

構成によれば、あなたが「MEDIATYPE」パラメータと戻り値のメディアタイプを制御することができます。/getXmlのようなものを試しましたか?mediaType = xml – Stan

+0

@Stan:いいえ、私はRequestMappingを変更できませんが、まだ結果を見るように試みます。 – Roxy

+1

リクエストマッピングの注釈ではありません。あなたがSpringに.parameterNameこのパラメータを使用してメディアタイプをチェックし、サーバー側に変更がないようにします。 – Stan

答えて

2
一般的に

あなたはJSONレスポンスを取得したい場合は、ジャクソン・データバインドモジュールが必要です。

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>${json-jackson-version}</version> 
</dependency> 

をして、あなたの設定でMappingJackson2HttpMessageConverterを定義する必要があります。

@Configuration 
@EnableWebMvc 
public class WebAppMainConfiguration extends WebMvcConfigurerAdapter { 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     converters.add(new MappingJackson2HttpMessageConverter()); 

     [..] 
     super.configureMessageConverters(converters); 
    } 

    [...] 
} 

あなたのケースでは、独自のAbstractGenericHttpMessageConverterを実装することができますので、メディアタイプに応じて異なるコンクリートコンバータ間でこのコンバータを切り替えることができます。

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { 
     configurer.defaultContentType(MediaType.APPLICATION_JSON_UTF8); 
    } 

} 

追加

チェック方法私にとってAbstractGenericHttpMessageConverter#writeInternal(..)

2

ignoreAcceptHeaderをtrueに設定してfavorPathExtensionをfalseに設定したので、springはコンテンツのネゴシエーションのための他の選択肢に依存します。それはあなたがXMLとJSONを設定したURLのパラメータになります意味ので

として@stan指摘/ GETXML?MEDIATYPE = XML(defaultContentType(MediaType.APPLICATION_JSON))それはJSONにデフォルト設定されます他のXML応答を返す必要があります

+0

あなたの応答に感謝しますが、私はすでに次のようなことをしています:\t contentTypeList.add(MediaType.APPLICATION_XML_VALUE); \t \t \t headers.put( "Content-Type"、contentTypeList);私はそれが "?mediatype = xml" – Roxy

+0

なしでXMLを送信すると期待していますが、これは起こっていません。 – Roxy

+0

コードを更新できますか – kuhajeyan

関連する問題