【问题标题】:CDI instance select by annotation class name通过注解类名选择 CDI 实例
【发布时间】:2013-11-15 08:26:20
【问题描述】:

我对 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 不会动态工作(对吗?)

谁能帮帮我?

【问题讨论】:

    标签: jakarta-ee cdi


    【解决方案1】:

    我知道您可以使用两个选项,可能对 CDI 有更深入了解的人可以建议一个更好的选项。

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

    • 解析可用实例

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

    希望对您有所帮助。

    【讨论】:

    • 我使用这种方法来解决问题。用 CDI 事件发音所有可能的限定词。好吧,它不是那么好,但它有效。谢谢
    【解决方案2】:

    限定符@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 Extension

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

    【讨论】:

      猜你喜欢
      • 2017-06-01
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 2016-06-08
      • 2021-01-07
      • 2023-03-10
      相关资源
      最近更新 更多