Я хочу использовать аннотации JAXB вместо аннотаций Джексона для сериализации и десериализации XML.
Я использую Spring Boot 2.1.3, который использует Spring 5.1.5 и Jackson 2.9.8.
Итак, я определил свой bean-компонент настройщика
@Bean
Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {
return (mapperBuilder) -> mapperBuilder
.modulesToInstall(new JaxbAnnotationModule())
.defaultUseWrapper(false);
}
, который автоматически работает в Spring MVC @RestController
s.
Однако он не применяется к запросам / ответам, сделанным с RestTemplate
.
Чтобы RestTemplate
работал, я должен был определить специальный MappingJackson2XmlHttpMessageConverter
бин.
@Bean
public MappingJackson2XmlHttpMessageConverter mappingJackson2XmlHttpMessageConverter(
Jackson2ObjectMapperBuilder builder) {
XmlMapper mapper = builder.createXmlMapper(true).build();
return new MappingJackson2XmlHttpMessageConverter(mapper);
}
Затем, когда понадобится RestTemplate
, я сам его создаю:
@Autowired
public AClient(RestTemplateBuilder restTemplateBuilder, MappingJackson2XmlHttpMessageConverter xmlHttpMessageConverter) {
this.xmlRestTemplate = restTemplateBuilder
.messageConverters(xmlHttpMessageConverter)
.build();
}
Мои проблемы с этим подходом:
- Мне нужно определить и автоматически передать второй компонент, как я могу избежать дублирования конфигурации?
- Шаблон Ibuild действителен только для XML.Я пробовал
addMessageConverters
, но он приводит к странным ошибкам при согласовании контента. - В интеграционных тестах это означает, что мне приходится издеваться над создателем, чтобы создать тот же шаблон, к которому привязывается фиктивный сервер MVC.Это может запутаться, как только появятся другие конфигурации шаблонов.
Что я хочу: Единый компонент, который предоставляет настройщик и применяется к конечным точкам MVC Spring, а также к RestTemplateBuilder (заменив XmlHttpMessageConverter по умолчанию)).