Jakarta ee CDI实例按注释类名选择
我对CDI实例有问题。在该项目中有多个JPA EntityManager。我想用要使用的实体管理器限定符来注释实体。这是注释: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; } 稍后,我用这
@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;
}
}