Spring mvc:将默认的响应格式从xml更改为json

时间:2016-12-08 09:51:54

标签: spring spring-mvc spring-boot

我已经解决了其他类似问题,但没有任何对我有用。

我的所有 API都返回JSON 作为响应默认

由于某些XML API,我不得不添加jackson-xml

content-type

现在默认情况下" 没有接受标头"所有回复都是XML

我希望将 JSON作为默认的响应格式

正如文档中所述:

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

我实现了以下配置:

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

案例1:如果我创建@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); } ,那么即使XML API返回JSON,一切都是JSON。

案例2:ignoreAcceptHeader(true)为默认值时为XML。

我忘记提及我的API看起来像这样:

ignoreAcceptHeader(false)

我在这里很丢失,我想要的只是默认(没有AcceptHeader)应该是JSON。 (API将XML作为String返回)

当Accept Header:&#34; Application / xml&#34;定义然后响应应该是XML。

任何建议都会有很大的帮助。

感谢。

3 个答案:

答案 0 :(得分:3)

一般情况下,如果你想获得json响应,你需要一个jackson-databind模块:

<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(..)

答案 1 :(得分:2)

由于您已将ignoreAcceptHeader设置为true并将favorPathExtension设置为false,因此spring将依赖于内容协商的其他替代方法。意味着它将看起来你配置了xml和json

的url参数

所以@stan指向/ getXml?mediaType = xml将返回xml响应,否则它将默认为json(defaultContentType(MediaType.APPLICATION_JSON))

答案 2 :(得分:1)

对我来说,添加

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

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

}

解决了这个问题。

现在默认情况下,如果请求中没有RestController标头,则所有Accept都返回JSON。 此外,如果传递Accept: application/xml标头,则结果为XML。

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