SpringBoot Rest Controller, поддерживающий как xml, так и json с JAXB Pojos + пользовательские преобразователи сообщений Http + Swagger-UI

Получение следующей ошибки Swagger, когда я представил пользовательские конвертеры сообщений

      Unable to render this definition
The provided definition does not specify a valid version field.

Please indicate a valid Swagger or OpenAPI version field. Supported version fields are swagger: "2.0" and those that match openapi: 3.0.n (for example, openapi: 3.0.0).

Ошибка вводит в заблуждение, я предполагаю, что ее путают с преобразователями. Есть идеи, чтобы исправить это?

Я следил - swagger-ui не работает с настраиваемым XML ObjectMapper (не повезло)

Фон:

Я создал pojos от xsd(s) до xjc. И у меня есть конечная точка отдыха, которая должна поддерживать как xml, так и json для запроса / ответа

Мы добились его работы, следуя разделу [весенняя документация][1]: 22.16.12 Конвертеры сообщений

Вот что я добавил в MyConfig

          @Configuration 
    @EnableWebMvc 
    public class MyConfig implements WebMvcConfigurer {
      @Override
      public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new MappingJackson2HttpMessageConverter(objectMapper()));
        converters.add(new MappingJackson2XmlHttpMessageConverter(xmlMapper()));
      }

      @Bean
      @Primary
      public ObjectMapper objectMapper() {
        return new Jackson2ObjectMapperBuilder()
                .modulesToInstall(new JaxbAnnotationModule())
                .build();
      }

      @Bean
      public XmlMapper xmlMapper() {
        return new Jackson2ObjectMapperBuilder()
                .indentOutput(true)
                .defaultUseWrapper(false)
                .serializationInclusion(JsonInclude.Include.NON_EMPTY)
                .modulesToInstall(new JaxbAnnotationModule())
                .createXmlMapper(true)
                .build();
      } 
    }

и мой контроллер

      // all the open api annotations //
@RequestMapping(value = "/run",
        produces = {"application/json", "application/xml"},
        consumes = {"application/json", "application/xml"},
        method = RequestMethod.POST)
public ResponseEntity<MyResponse> run(@RequestBody MyRequest request) {

1 ответ

Хорошо, о том, какой objectMapper. Мне пришлось очистить и удалить @primary, что помогло MyConfig

          @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        return new MappingJackson2HttpMessageConverter(new Jackson2ObjectMapperBuilder()
                .modulesToInstall(new JaxbAnnotationModule())
                .build());
    }

    @Bean
    public MappingJackson2XmlHttpMessageConverter mappingJackson2XmlHttpMessageConverter() {
        return new MappingJackson2XmlHttpMessageConverter(new Jackson2ObjectMapperBuilder()
                .indentOutput(true)
                .defaultUseWrapper(false)
                .serializationInclusion(JsonInclude.Include.NON_EMPTY)
                .modulesToInstall(new JaxbAnnotationModule())
                .createXmlMapper(true)
                .build());
    }
Другие вопросы по тегам