我的CDI实例有问题。在该项目中,有多个JPA EntityManager。我想使用实体管理器限定符来注释entites。这是注释:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ManagedEntity {
Class<? extends Annotation> value() default BaseEntityManager.class;
}
我的实体注释了它:
@Entity
@Table(name="TEST")
@ManagedEntity(StandardEntityManager.class)
public class MyEntity { ... }
稍后我使用此实体构建一些查询,只保存查询上下文。使用此上下文,a可以执行查询。我需要的是一种获得正确的实体经理的方法。所以我注入任何EntityManager实例并尝试选择正确的实例。
@Inject
@Any
private Instance<EntityManager> entityManagers;
...
// Read out the ManagedEntity and check for mixed managers
Class<? extends Annotation> manager = getQueryManager(queryContext);
...
// Select requires Annotation
EntityManager em = entityManagers.select(... classname to annotation ...).get();
// ... QueryContext to query and execute here ...
我的问题是,我找不到如何从其类名中获取Annotation的方法。如果我代理一个新实例cdi不接受它,建立一个AnnotationLiteral剂量不能动态地工作(纠正我?)
任何人都可以帮助我吗?
答案 0 :(得分:0)
我知道你可以使用两个选项,可能对CDI有更强知识的人可以提出更好的选择。
如果您有一小组注释,那么您可以在这种情况下使用AnnotationLiteral定义。如Javadoc所示,创建一个单独的文字类,然后将该类的实例传递给查找代码。
迭代可用实例,找到与您要查找的类型匹配的实例。找到后,将其用于实体操作。
希望有所帮助。
答案 1 :(得分:0)
限定符@Any声明您需要实现的所有实例。
它们有什么限定符并不重要,你想要它们@BaseEntityManager,@ StandardEntityManager等等。可以使用AnnotationLiteral,可能是你没有正确使用AnnotationLiteral。
这是正确的用法
public class ManagedEntityQualifer extends AnnotationLiteral<ManagedEntity>
implements ManagedEntity {
final String name;
ManagedEntityQualifer (String name) {
this.name = name;
}
@Override
public String value() {
return name;
}
}
或者您可以使用CDI Portable扩展
查看这些帖子 Dynamic Dependency Injection AutomatedTellerMachineImpl @Inject @Any Instance to inject all transport instances