整合完成后出现如下错误信息:

Please indicate a valid Swagger or OpenAPI version field. Supported version fields are swagger: "2.0" and those that match openapi: 3.x.y (for example, openapi: 3.1.0).

简单说明该错误形成的原因,由于配置了MappingJackson2HttpMessageConverter,导致所有的请求都走了该自定义的objectmapper,从而破坏了OpenAPI JSON。我的错误原因是在继承了

WebMvcConfigurer的配置中重写了extendMessageConverters方法,代码如下:
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    MappingJackson2HttpMessageConverter messageConverter =
            new MappingJackson2HttpMessageConverter();
    JacksonObjectMapper jacksonObjectMapper = new JacksonObjectMapper();
    jacksonObjectMapper.setTimeZone(TimeZone.getDefault());
    messageConverter.setObjectMapper(jacksonObjectMapper);
    converters.add(0, messageConverter);

把自定义的objectmapper注入到了第一位,从而导致了所有的请求都会使用该自定义的objectmapper,从而导致springdoc出现该错误,我搜索了网上基本没啥说明白的,特此简单记录一下:

  • 自定义的 ObjectMapper 放到 MVC 消息转换器里最前面(converters.add(0, messageConverter))。

  • SpringDoc 查找 MappingJackson2HttpMessageConverter 时,拿到的就是你注入的 ObjectMapper。

  • 因此 /v3/api-docs 输出也就使用了你自定义的配置。

解决办法如下:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.t3rik.framework.config.json.JacksonObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import java.util.TimeZone;

@Configuration
public class JacksonConfig {

    @Bean
    @Primary  // 让 Spring 注入时优先使用这个 ObjectMapper
    public ObjectMapper objectMapper() {
       // 你自己的 JacksonObjectMapper(继承 ObjectMapper)
       JacksonObjectMapper objectMapper = new JacksonObjectMapper();

       // 设置时区(可选)
       objectMapper.setTimeZone(TimeZone.getDefault());

       return objectMapper;
    }
}

简单做下说明,为什么不会影响 Springdoc

  • 新方案中我们配置了全局 Jackson(自定义 @Primary ObjectMapper

  • Springdoc 生成 /v3/api-docs不会使用 Spring MVC 的 HttpMessageConverter

  • 它通过自己的 ObjectMapperProvider 获取 ObjectMapper,序列化 OpenAPI 对象

  • 因此我们对全局 ObjectMapper 的配置(日期格式、Long -> String 等)不会影响 OpenAPI 文档,也就避免了 swagger-ui 报错的问题

  • 至此问题完美解决,撒花

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐