OpenAPI Generator生成Spring模型时如何自动添加JsonFormat导入
- 运行环境:OpenAPI Generator 5.4.0,使用spring生成器,基于Gradle构建项目,需要在自动生成的模型类中添加指定导入语句。
- 现有配置:针对API规范中的特定字段添加了如下扩展配置,当前配置可正常生效:
x-field-extra-annotation: "@com.fasterxml.jackson.annotation.JsonFormat ...."
- 待解决问题:不想使用全限定类名编写注解,需要在代码生成阶段自动添加
com.fasterxml.jackson.annotation.JsonFormat对应的导入语句。 - 已尝试无效方案:在
generateCode任务中配置importMappings参数,映射规则如下,配置未生效:
importMappings = [ 'JsonFormat': 'com.fasterxml.jackson.annotation.JsonFormat' ]
- 已知可行方案:在项目中引入自定义
model.mustache模板,手动在模板中添加对应导入语句,示例写法如下:
{{#useBeanValidation}} ... import com.fasterxml.jackson.annotation.JsonFormat; ... {{/useBeanValidation}}
- 诉求:寻找比自定义模板更简便优雅的实现方案。
先明确importMappings不生效的核心原因:该配置仅用于映射OpenAPI规范中显式定义的模型、字段类型对应的导入规则,不会扫描x-field-extra-annotation这类扩展属性中编写的类名,自然无法自动追加对应导入。
不需要自定义模板即可实现需求的方案有两种,可根据实际使用场景选择:
方案1:全局追加固定导入
如果大部分生成的模型类都要用到@JsonFormat这类注解,直接在Gradle的openApiGenerate任务中配置additionalImports参数即可,该配置会给所有生成的模型类自动追加指定的导入语句,配置示例:
openApiGenerate { generatorName = "spring" // 其余原有配置(inputSpec、outputDir、apiPackage、modelPackage等)保持不变 additionalImports = [ "com.fasterxml.jackson.annotation.JsonFormat" ] }
配置完成后,x-field-extra-annotation中可以直接使用短类名@JsonFormat编写注解,不需要写全限定名。
这个方案的优势是配置量极小,不需要修改任何模板,后续升级OpenAPI Generator版本时不需要同步维护自定义模板,维护成本极低;缺点是未使用@JsonFormat的模型类也会被追加该导入,不过绝大多数IDE、构建插件都会自动识别未使用的导入,不会影响编译和运行。
方案2:按模型按需追加导入
如果只有个别模型的个别字段需要用到@JsonFormat这类注解,不需要全局加导入,可以直接在对应Schema定义上添加x-imports扩展声明,OpenAPI Generator 5.x版本的默认spring模板已经原生支持渲染该扩展下的导入,不需要自定义模板,配置示例:
components: schemas: Order: type: object # 仅给当前Order模型类追加指定导入 x-imports: - com.fasterxml.jackson.annotation.JsonFormat properties: payTime: type: string format: date-time # 这里直接用短类名即可 x-field-extra-annotation: "@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")"
这个方案的优势是完全按需追加导入,没有冗余的import语句,也不需要修改全局配置和模板,灵活度最高。
只有当需要实现更复杂的动态导入逻辑(比如根据字段类型、注解参数动态判断要导入的类)时,才需要使用自定义mustache模板的方案,上述两种方案的维护成本都远低于自定义模板。
内容的提问来源于stack exchange,提问作者user518066

