2016-12-08 114 views
5

我已經通過了其他類似的問題,但沒有爲我工作。Spring mvc:將默認的響應格式從xml更改爲json

默認全部我API的返回JSON爲響應

因爲一些XML API的,我不得不添加傑克遜的XML

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

現在默認「無接受標題「所有回覆均爲XML

我想有JSON作爲默認響應格式

如DOC這裏所說:

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 API返回JSON。

案例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)

而且,當接受標題:「Application/xml」被定義時,則響應應該是XML。

任何意見都會有很大的幫助。

謝謝。

+2

根據配置可以有效控制「mediaType的」參數返回的媒體類型。你嘗試像/的getXML mediaType的= XML – Stan

+0

@Stan:不,我不能改變RequestMapping但我仍然會嘗試以查看結果 – Roxy

+1

這不是請求映射註解,因爲我明白你說的與.parameterName到Spring (「mediaType的」)語句中使用該參數來檢查介質類型,以便有你的服務器端 – 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,這樣你就可以根據媒體類型在不同的混凝土轉換器之間切換這個轉換器。

檢查方法AbstractGenericHttpMessageConverter#writeInternal(..)

2

由於您已將ignoreAcceptHeader設置爲true,將favorPathExtension設置爲false,因此spring將依賴其他用於內容協商的備選方案。也就是說它會看你已經配置XML和JSON的URL參數

從而@stan指出/的getXML?mediaType的= XML將應返回的XML響應否則將默認爲JSON(defaultContentType(MediaType.APPLICATION_JSON))

+0

感謝您的答覆,但我已經做了這樣的事情:\t contentTypeList.add(MediaType.APPLICATION_XML_VALUE); \t \t \t headers.put( 「內容類型」,contentTypeList);我希望它發送沒有「?mediatype = xml」 – Roxy

+0

的XML,但這不會發生。 – Roxy

+0

你可以更新你的代碼嗎? – kuhajeyan

0

對於我來說,加入

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 

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

} 

解決了這個問題。

現在默認情況下所有RestController都返回JSON,如果請求中沒有Accept頭。 此外,如果Accept: application/xml頭通過,則結果是XML。

此外,值得一讀:https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc