jackson-dataformat-xml将@ResponseBody转换为XML [英] jackson-dataformat-xml turns @ResponseBody to XML

查看:102
本文介绍了jackson-dataformat-xml将@ResponseBody转换为XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因此,我拥有一个运行良好的Spring应用程序.我的大多数控制器方法都用于ajax调用,这些调用通过具有jackson api的@ResponseBody返回JSON并将Java POJO返回到JSON.

So I had a perfectly working Spring app. Most of my controller methods are for ajax calls that return JSON via @ResponseBody with the jackson api and returns my Java POJO to JSON.

我需要将XML转换为JSON,因此我发现Jackson为此提供了一个工具,并将其添加到我的POM中以使用该库:

I have a need to turn XML to JSON, so I find that Jackson has a tool for that, and I add this to my POM to use the library:

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

以便我可以使用它:

    XmlMapper xmlMapper = new XmlMapper();
    JsonNode node = xmlMapper.readTree(sb.toString().getBytes());

但是现在@ResponseBody返回的是XML,而不是JSON.我删除了依赖关系,控制器再次返回JSON.

But now the @ResponseBody is returning XML and not JSON. I Remove the dependency and the controllers return JSON again.

有什么办法同时获得两者的吗?我想要xmlMapper和响应正文中的JSON.

Any way to get both? I want the xmlMapper, and JSON from the response body.

推荐答案

jackson-dataformat-xml 似乎正在将 MappingJackson2HttpMessageConverter 注册到 XmlMapper ,以及其他与XML一起使用的 HttpMessageConverter .如果您始终打算从控制器返回JSON,则可以通过覆盖 configureMessageConverters

jackson-dataformat-xml appears to be registering a MappingJackson2HttpMessageConverter with a XmlMapper, along with other HttpMessageConverters that work with XML. If you always intended to return JSON from your controllers, you can change what HttpMessageConverter your app uses by overriding configureMessageConverters

对于Spring 5.0及更高版本,

For Spring 5.0 and above,

@Configuration
public class HttpResponseConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.removeIf(converter -> supportsXml(converter) || hasXmlMapper(converter));
    }

    private boolean supportsXml(HttpMessageConverter<?> converter) {
        return converter.getSupportedMediaTypes().stream()
            .map(MimeType::getSubtype)
            .anyMatch(subType -> subType.equalsIgnoreCase("xml"));
    }

    private boolean hasXmlMapper(HttpMessageConverter<?> converter) {
        return converter instanceof MappingJackson2HttpMessageConverter
                && ((MappingJackson2HttpMessageConverter)converter).getObjectMapper().getClass().equals(XmlMapper.class);
    }

}

对于较旧的Spring版本,将 implements WebMvcConfigurer 替换为 extends WebMvcConfigurerAdapter

For older versions of Spring, replace implements WebMvcConfigurer with extends WebMvcConfigurerAdapter

这篇关于jackson-dataformat-xml将@ResponseBody转换为XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆