jackson-dataformat-xml 将 @ResponseBody 转换为 XML

2024-04-04

So I had一个完美运行的 Spring 应用程序。我的大多数控制器方法用于 ajax 调用,这些调用通过 @ResponseBody 使用 jackson api 返回 JSON,并将我的 Java POJO 返回为 JSON。

我需要将 XML 转换为 JSON,所以我发现 Jackson 有一个用于此目的的工具,我将其添加到我的 POM 中以使用该库:

    <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。

有什么办法可以两者兼得吗?我想要 xmlMapper 和响应正文中的 JSON。


jackson-dataformat-xml似乎正在注册一个MappingJackson2HttpMessageConverter with a XmlMapper,以及其他HttpMessageConverter可以使用 XML。如果您总是打算从控制器返回 JSON,您可以更改什么HttpMessageConverter您的应用程序通过覆盖使用configureMessageConverters

对于 Spring 5.0 及更高版本,

@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 with extends WebMvcConfigurerAdapter

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jackson-dataformat-xml 将 @ResponseBody 转换为 XML 的相关文章

随机推荐