Jakarta ee CDI实例按注释类名选择

Jakarta ee CDI实例按注释类名选择,jakarta-ee,cdi,Jakarta Ee,Cdi,我对CDI实例有问题。在该项目中有多个JPA EntityManager。我想用要使用的实体管理器限定符来注释实体。这是注释: @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface ManagedEntity { Class<? extends Annotation> value() default BaseEntityManager.class; } 稍后,我用这

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

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ManagedEntity {
    Class<? extends Annotation> value() default BaseEntityManager.class;
}
稍后,我用这个实体构建一些查询,并保存查询上下文。在这个上下文中,用户可以执行查询。我需要的是找到合适的实体经理的方法。因此,我注入了所有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 ...
@Inject
@任何
私有实例实体管理器;
...
//宣读经理身份并检查混合经理

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

  • 基于
如果您有一小组注释,则可以在这种情况下使用AnnotationLiteral定义。如Javadoc所示,创建一个单独的文本类,然后将该类的实例传递给查找代码

  • 解析可用的实例
迭代可用实例,并找到与您要查找的类型匹配的实例。找到后,将其用于实体操作


希望有帮助。

限定符@表示您需要实现的所有实例的任何状态

不管他们有什么限定符,你都需要@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;
            }
        }
public类managedentityqualifier扩展了AnnotationLiteral
实现可管理性{
最后的字符串名;
ManagedEntityQualifer(字符串名称){
this.name=名称;
}
@凌驾
公共字符串值(){
返回名称;
}
}
或者您可以使用CDI便携式扩展

看到这些帖子了吗

我用这种方法作为变通方法。用CDI事件发音所有可能的限定词。虽然没那么好,但很管用。谢谢
 public class ManagedEntityQualifer extends AnnotationLiteral<ManagedEntity>
implements ManagedEntity {

            final String name;

            ManagedEntityQualifer (String name) {
                this.name = name;
            }

            @Override
            public String value() {
                return name;
            }
        }