在我有两个dataSource的spring boot应用程序中,
我需要使用@Transactional
注释使用以下参数选择正确的dataSource:
value
(必填) readOnly
(默认:false) 我想创建一个@interface
所以我不必输入值(开发人员犯错的可能性就是激励决定)
所以这需要写在一个类中:
@Transactional("transactionManager2")
我创建了以下@interface
:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional("transactionManager2")
public @interface TransactionManager2Tx {
}
此注释替换@Transactional("transactionManager2")
并且运行良好。
但是,我无法传递其他参数。例如,这是不可能的:
@TransactionManager2Tx(readOnly = true)
我怎样才能做到这一点?
答案 0 :(得分:1)
通常 - 这是不可能的,因为注释的元素值是在编译时定义的。您无法在那里动态传递值。
但是,在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 {
}