问题描述
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 not working with custom XML ObjectMapper(运气不好)
背景:
我已经从 xsd(s) 到 xjc 生成了 pojo。我有一个休息端点,它需要同时支持 xml 和 json 请求/响应
我们通过遵循 [spring 文档][1] 部分使其正常工作:22.16.12 消息转换器
@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",method = RequestMethod.POST)
public ResponseEntity<MyResponse> run(@RequestBody MyRequest request) {
解决方法
确定是哪个 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());
}