Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用它扩展java@Interface';s参数_Java_Spring_Annotations - Fatal编程技术网

如何用它扩展java@Interface';s参数

如何用它扩展java@Interface';s参数,java,spring,annotations,Java,Spring,Annotations,在spring boot应用程序中,我有两个数据源 我需要使用带有以下参数的@Transactional注释选择适当的数据源: 字符串值(必需) 布尔值只读(默认值:false) 我想创建一个@接口,这样我就不必键入值(开发人员犯错误的机会就是促使决策的原因) 所以这需要在类中编写: @Transactional("transactionManager2") 我已经创建了以下@接口: @Target({ElementType.METHOD, ElementType.TYPE}) @Rete

在spring boot应用程序中,我有两个数据源

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

  • 字符串<代码>值(必需)
  • 布尔值
    只读(默认值:false)
我想创建一个
@接口
,这样我就不必键入值(开发人员犯错误的机会就是促使决策的原因)

所以这需要在类中编写:

@Transactional("transactionManager2")
我已经创建了以下
@接口

@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 {
}

查看我的下一次更新=))