当前位置: 首页 > 知识库问答 >
问题:

SpringMVC:将默认响应格式从xml更改为json

赵雪峰
2023-03-14

我经历过其他类似的问题,但没有一个对我有用。

默认情况下,所有my API都将JSON作为响应返回:

因为一些XML API,我不得不添加jackson-xml

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

现在默认情况下“不带accept标头”所有响应都是XML。

我希望使用JSON作为默认响应格式。

如本文件所述:

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,那么所有内容都是JSON,即使是返回JSON的XML API。

情况2:当忽略(false)时,则默认为XML。

我忘了提到我的API是这样的:

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

我相当迷失在这里,所有我想要的是默认(没有AcceptHeader)应该是JSON.(API返回XML为String)

当定义了接受标头:“应用程序/xml”时,响应应该是XML。

任何建议都会大有帮助。

谢谢

共有3个答案

倪举
2023-03-14

由于您已将IgnoreAccptHeader设置为true,将favorPathExtension设置为false,spring将依赖其他备选方案进行内容协商。意味着它将查找您配置了XML和JSON的URL参数

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

施誉
2023-03-14

对我来说,补充说

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

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

}

解决了这个问题。

现在,默认情况下,如果请求中没有Accept头,则allRestControllers返回JSON。另外,如果传递了Accept:application/xml头,则结果是xml。

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

羊舌庆
2023-03-14

通常,如果您想要获得json响应,您需要一个jackson数据绑定模块:

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

然后,您必须在配置中定义一个MappingJackson2HttpMessageConzer

@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或3个小数)。 我需要使用浮点数而不是十进制数。另外,我不允许截断/舍入浮动。 有没有办法更改默认行为? 问题答案: 像Ignacio所说的那样,您不可以猴子C类型。 但是,如果这样做的确非常困难,并且您知道一些C,则可以自己

  • 我有一个REST控制器,它可以返回如下产品列表: 电流输出 为了让我们的JS网格库能够正常工作,我需要修改响应,使其看起来像: 期望输出 控制器 有没有一种简单的方法可以使用本地Spring库修改JSON响应?

  • 问题内容: 我想使用一些需要Python的较新软件,并且我们目前已将它们同时安装在专用的CentOS服务器上,如下所示: 如何切换为默认使用? 问题答案: 作为根: 这将从/ usr / local / bin / python-> /usr/bin/python2.6建立符号链接(替换旧的硬链接)。

  • 我使用的是flume的纯节点(测试)模式;我的水槽以如下方式启动: 水槽节点-1-c$FQDN':amqp(“exchangeName=[exchange name]”,“bindings=[binding name]””,“host=127.0.0.1”,“port=5672”,“userName=[user]”,”password=[pass]“,”exchangeType=direct“,”

  • 在本期续篇中 主代码: 然后我需要得到一个最接近给定日期的值列表: 然后弄一张这样的桌子: 但如何才能得到这种格式的结果: 我在此上下文中使用pivot的所有尝试都没有成功。 更新 根据@Gordon Linoff和@xxx的建议,尝试重做使用Dinamic SQL的代码,现在开始: ‘op为(选择op.id_object,op.id_param,name,op.cdate,op.value,RO

  • 我有一个基于Spring Security OAuth2的REST应用程序。我一直试图将默认的Spring Security消息传递格式从XML更改为JSON,并取得了部分成功。 对于eg--我知道了当请求不包含承载令牌时如何更改响应格式(下面一行就是这样做的) 如何更改BadCredentialsException JSON格式?当前,它返回一个类似于上面的JSON? 下面是我的applicat

  • 问题内容: 我想将MySQL服务器的默认端口号更改为3306。我想将其更改为3360。 我努力了: 但是事情对我不起作用。请提供查询以更改端口而不进行任何配置。我正在使用Windows 8 64位。 问题答案: 您需要编辑文件,并确保已按照以下行设置了端口: 然后重新启动MySQL服务,您应该一切顺利。没有查询,您可以运行以进行更改,因为它不是动态变量(有关MySQL文档,其中显示了所有系统变量的

  • 问题内容: 从默认的SQLite数据库迁移到Postgres数据库需要采取什么步骤? 我这样做是为了使本地开发环境尽可能靠近我的实时服务器(使用postrgres)。 还是本地开发使用SQLite的原因?不建议使用Postgres进行本地开发吗? 问题答案: 您可以尝试以下步骤: 1.安装psycopg2以配置数据库: 2.默认里面 更改原始值: 至: 3.迁移数据库: 编辑: 感谢@robotH