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());
}