Активируйте модуль JAXB для Джексона для RestTemplate, а также Spring MVC - PullRequest
0 голосов
/ 21 апреля 2019

Я хочу использовать аннотации 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();
}

Мои проблемы с этим подходом:

  1. Мне нужно определить и автоматически передать второй компонент, как я могу избежать дублирования конфигурации?
  2. Шаблон Ibuild действителен только для XML.Я пробовал addMessageConverters, но он приводит к странным ошибкам при согласовании контента.
  3. В интеграционных тестах это означает, что мне приходится издеваться над создателем, чтобы создать тот же шаблон, к которому привязывается фиктивный сервер MVC.Это может запутаться, как только появятся другие конфигурации шаблонов.

Что я хочу: Единый компонент, который предоставляет настройщик и применяется к конечным точкам MVC Spring, а также к RestTemplateBuilder (заменив XmlHttpMessageConverter по умолчанию)).

...