我正在尝试使用 Spring 的 RestTemplate 自动反序列化 XML 格式的响应。我正在使用 Jackson 的 jackson-dataformat-xml
模块,为此 Spring Boot 设置为自动配置。我想在要反序列化到的类中使用 JAXB 注释,但它似乎不起作用。这是我希望类看起来像的示例:
@XmlRootElement(name="Book")
public class Book {
@XmlElement(name="Title")
private String title;
@XmlElement(name="Author")
private String author;
}
这基于以下 XML 示例:
<Book>
<Title>My Book</Title>
<Author>Me</Author>
</Book>
但是,对于像上面那样注释的类,字段总是设置为 null
。我做了一些实验,发现如果我使用 Jackson 的 @JsonProperty
来注释子元素,反序列化会起作用:
@XmlRootElement(name="Book")
public class Book {
@JsonProperty("Title")
private String title;
@JsonProperty("Author")
private String author;
}
它有效,但不知何故我觉得它有点尴尬。有没有办法让 JAXB 注释像我的第一个示例中那样工作?
jackson 提供jackson-module-jaxb-annotations
XML 数据绑定(bind)模块与 JAXB 注释一起工作。但是,我不确定如何设置 RestTemplate
使用的 ObjectMapper
来使用这个模块。
最佳答案
为了解决这个问题,我需要向添加到 Spring 的 RestTemplate
的转换器使用的每个 ObjectMapper
注册一个 JaxbAnnotationModule
实例。该类(class)包含在 Jackson 的 jackson-module-jaxb-annotations
中。模块,我通过 Gradle 添加到我的构建中。
将依赖项添加到我的项目后,我接下来要做的是配置我的应用程序使用的 RestTemplate
。 ObjectMapper
实例由 Spring 自动配置的 MappingJackson2XmlHttpMessageConverter
使用。我必须向每个转换器中使用的每个 ObjectMapper
注册 JaxbAnnotationModule
实例,因此第一个任务是使用以下方法找到所有 MappingJackson2XmlHttpMessageConverter
:
//create module
JaxbAnnotationModule jaxbAnnotationModule = new JaxbAnnotationModule();
restTemplate.getMessageConverters().stream().filter(converter -> {
return converter instanceof MappingJackson2XmlHttpMessageConverter;
})
一旦我拥有所有相关的转换器,我就将模块注册到它们的每个 ObjectMappers
:
forEach(converter -> {
((MappingJackson2XmlHttpMessageConverter) converter)
.getObjectMapper()
.register(jaxbAnnotationModule);
});
关于java - 如何将 JAXB 注释与 Spring RestTemplate 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41288036/