gpt4 book ai didi

java - 如何使用它的参数扩展java @Interface

转载 作者:行者123 更新时间:2023-11-30 06:26:29 24 4
gpt4 key购买 nike

在一个 Spring Boot 应用程序中,我有两个数据源,

我需要使用带有以下参数的 @Transactional 注释来选择正确的数据源:

  • 字符串(必需)
  • boolean 值只读 (默认:false)

我想创建一个@interface,这样我就不必输入值(开发人员犯错误的可能性会促使我做出决定)

所以这需要写在一个类中:

@Transactional("transactionManager2")

我创建了以下@interface:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional("transactionManager2")
public @interface TransactionManager2Tx {
}

此注释替换了 @Transactional("transactionManager2") 并且运行良好。

但是,我无法传递其他参数。例如,这是不可能的:

@TransactionManager2Tx(readOnly = true)

我怎样才能实现这个目标?

最佳答案

通常 - 这是不可能的,因为注释的元素值是在编译时定义的。您无法在那里动态传递值。

但是,在 Spring 中,有一个棘手的注释类型 @AliasFor

您可以尝试执行以下操作:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional("transactionManager2")
public @interface TransactionManager2Tx {

@AliasFor(annotation = Transactional.class, attribute = "readOnly")
boolean readOnly() default false;

}

如果它不起作用,您始终可以定义两个不同的注释,例如:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional(value = "transactionManager2", readOnly = true)
public @interface ReadOnlyTransactionManager2Tx {
}

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional(value = "transactionManager2", readOnly = false)
public @interface NonReadOnlyTransactionManager2Tx {
}

关于java - 如何使用它的参数扩展java @Interface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47098740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com