CDI实例按注释类名称选择

时间:2013-11-15 08:26:21

标签: java-ee cdi

我的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剂量不能动态地工作(纠正我?)

任何人都可以帮助我吗?

2 个答案:

答案 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扩展

CDI Portalbe Extension

查看这些帖子  Dynamic Dependency Injection AutomatedTellerMachineImpl @Inject @Any Instance to inject all transport instances