java - 如何在 Java 或 Kotlin 中使用我自己的注释包装 @Column 注释

标签 java kotlin annotations

我只是想拥有自己的注释来清理注释质量,并在需要时轻松更改它们;

import javax.persistence.Column
import javax.validation.constraints.Size
class Foo(){
    @Column(name="bar_", nullable = false, length = 32)
    @Size(min = 32, max = 32)
    String bar;

    @Column(nullable = false, length = 32)
    @Size(min = 32, max = 32)
    String bas;

    @Column(nullable = false, length = 32, unique=true)
    @Size(min = 32, max = 32)
    String baq;
}
希望我能
class Foo(){
    @MyColumn(name="bar_")
    String bar;

    @MyColumn
    String bas;

    @MyColumn(unique=true)
    String baq;
}
nullable = false, length = 32是默认参数。
欢迎使用 Java 或 Kotlin 解决方案。

最佳答案

由于您使用的是从 javax 导入的第 3 方注释。最好的选择是引入复合注释。 (Kotlin doesn't support 注释继承。

@Column(name = "bar_", nullable = false, length = 32)
@Size(min = 32, max = 32)
annotation class Anno
Spring Boot 在将大量配置注释组合在一起时做得非常好 - check it out .
复合注解有问题Anno ,寿。您必须提供具有常量值的注释参数。
如果你确定,你需要一个参数化的注释,比如
@Column(...)
@Size(min = Anno.max, max = Anno.min)
annotation class Anno(val min: Int, val max: Int)
看看Kapt或 Kotlin Compiler 插件,您将需要一段代码生成。
使用 Kapt 或 Kotlin 编译器插件,您只需覆盖 newField您的自定义方法 ClassBuilder :
  override fun newField(
      origin: JvmDeclarationOrigin,
      access: Int,
      name: String,
      desc: String,
      signature: String?,
      value: Any?
  ): FieldVisitor {
    // if field is annotated with Anno -- add two custom annotation with parameters of your choice
    // otherwise perform a standard field init
  }
然后注册它
class AnnoRegister : ComponentRegistrar {
  override fun registerProjectComponents(
      project: MockProject,
      configuration: CompilerConfiguration
  ) {
    ...
  }
将此处理集成到现有的 gradle 或 maven 项目中应该相对容易,或者只是传递给 kotlinc .

关于java - 如何在 Java 或 Kotlin 中使用我自己的注释包装 @Column 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65037923/

相关文章:

java - 关于Spring MVC如何使用@RequestMapping注解实现RESTfull架构的一些说明

java - 如何运行 WorkManager 每 5 秒重试一次工作

java - Kotlin Kmongo 插入并返回插入的项目

java.io.FileNotFoundException : open failed: EISDIR (Is a directory) 错误

java - 我可以扩展一个类并覆盖封闭的枚举类型吗?

android - Firebase isEmailVerify在Kotlin中不起作用

java - 用于 Hibernate 搜索中时间戳的 FieldBridge

java - Java注解的必要性

java - 如何在 Web 服务中序列化公共(public)静态最终字符串?

java - 如何修复struts漏洞