我使用Kotlin和https://github.com/vojtechhabarta/typescript-generator为我在API中使用的类生成TypeScript定义。
为了保留可空性信息,typescript-generator可以使用字段和方法上的注释。它支持构建脚本中列出的任意注释类名称。
Kotlin出于某种原因使用@org.jetbrains.annotations.Nullable
而不是JSR-305注释@javax.annotation.Nullable
来注释可空字段。
虽然JSR-305注释具有RetentionPolicy.RUNTIME
,但Jetbrains注释具有RetentionPolicy.CLASS
,因此不适合使用Java Reflection检测注释的库进行内省。
是否有可能让Kotlin生成基于标准的注释而不是JetBrains专有注释?
如果没有,我对解决问题的简单解决方案感兴趣。也许Gradle插件可以从JetBrains或类似的东西生成JSR-305注释。我更愿意不必使用?
和@Nullable
对所有内容进行双重注释。
答案 0 :(得分:3)
Kotlin旨在发出自己的(JetBrains)注释。之所以选择是因为JSR 305从未发布过,并且JetBrains没有合法的方式将JSR 305注释与编译器捆绑在一起,因为(休眠)JSR 305上的许可证不允许它。 com.google.code.findbugs:jsr305
maven工件的合法状态同样是模糊的,因为javax
包命名空间是专门为JSR保留的。
有以下可能的解决方案:
编写一个自定义Gradle插件,对后续处理Kotlin编译的类文件并将org.jetbrains.annotations.*
注释更改为相应的javax.annotation.*
注释(NotNull
至Nonnull
, Nullable
到Nullable
)并将相应的attiributes从运行时不可见注释更改为运行时可见注释。
修补程序typescript-generator
,以便除了Java Reflection之外还使用Kotlin反射API从Kotlin类中获取nullablitity信息。此任务的入口点是kotlin扩展Java Class
实例,允许检索所有Kotlin元数据。
将jackson-module-kotlin
添加到typescript-generator
。该模块使用Kotlin的反射来获取所有Kotlin特定信息并将其提供给Jackson,而typescript-generator
使用Jackson bean内省来获取其类型信息,因此它可能正常工作。