0

我对 CDI 实例有疑问。在项目中有不止一个 JPA EntityManager。我想用要使用的实体管理器限定符来注释实体。这是注释:

@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 ...

我的问题是没有找到一种方法如何从其类名中获取注释。如果我代理一个新实例 cdi 不接受它,则构建 AnnotationLiteral 不会动态工作(对吗?)

谁能帮我?

4

2 回答 2

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 便携式扩展

CDI Portalbe 扩展

查看这些帖子 Dynamic Dependency Injection AutomatedTellerMachineImpl @Inject @Any Instance 以注入所有传输实例

于 2013-11-18T13:53:49.037 回答
0

我知道您可以使用两种选择,可能对 CDI 有更深入了解的人可以提出更好的选择。

如果您有少量注释,则可以针对这种情况使用 AnnotationLiteral 定义。如 Javadoc 中所示,创建一个单独的文字类,然后将该类的一个实例传递给您的查找代码。

  • 解析可用实例

遍历可用实例并找到与您要查找的类型匹配的实例。找到后,将其用于您的实体操作。

希望有帮助。

于 2013-11-15T08:58:51.390 回答