springdoc-openapi生成OpenAPI定义无法识别Scala类属性如何解决
springdoc-openapi的Schema解析逻辑完全依赖项目中Jackson序列化器的类结构识别能力。Scala编译生成的类(包括case class)不遵循标准JavaBean规范:
- 不会自动生成符合JavaBean命名规则的getter/setter方法
- 构造参数绑定、Scala内置类型(比如
Option)的序列化逻辑需要专属扩展模块支持
默认配置下Jackson没有适配Scala语法的能力,因此只能识别到类本身,无法解析出具体属性,和你观察到的现象完全一致。
1. 引入Jackson Scala模块依赖
根据项目使用的Scala大版本(2.12/2.13)、Spring Boot内置的Jackson版本引入对应依赖。你当前使用的springdoc-openapi-ui 1.6.9通常配套Spring Boot 2.7.x,内置Jackson版本为2.13.x,Maven配置参考如下(Scala 2.13版本):
<dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-scala_2.13</artifactId> <version>2.13.5</version> </dependency>
如果项目用Scala 2.12,直接把artifactId里的2.13替换为2.12即可,注意Jackson模块版本必须和Spring Boot内置的Jackson版本完全对齐,避免出现版本冲突。
2. 注册Scala模块到Spring容器
新建配置类,将Jackson Scala模块注册为Spring Bean,Spring会自动将该模块注入到全局使用的ObjectMapper实例中,代码如下:
import com.fasterxml.jackson.module.scala.DefaultScalaModule import org.springframework.context.annotation.{Bean, Configuration} @Configuration class JacksonConfig { @Bean def defaultScalaModule: DefaultScalaModule = new DefaultScalaModule() }
3. (可选)兜底配置
完成前两步后绝大多数场景都能正常识别属性,如果仍有个别字段扫描异常,可以在application配置文件中补充如下配置,强制springdoc直接复用Jackson的序列化规则生成Schema:
springdoc: override-with-generic-parameter: false
同时确保Scala编译插件没有开启字段名裁剪、字节码混淆类的优化,case class待识别的属性不要用private修饰即可。
重启项目后再次调用/v3/api-docs接口,就能看到OpenApiTest的Schema中正常带出a、b两个字符串类型的属性。
内容的提问来源于stack exchange,提问作者laladelolo

