当前位置: 首页 > 知识库问答 >
问题:

基于@Inject字段CDI使用@Qualifier

郜卓君
2023-03-14

我在CDI条件注射中遇到了问题,无法在EJB的注射中使用一种策略。

我的实际情况是:

public class someManagedBean {

    @Inject 
    @MyOwnQualifier(condition = someBean.getSomeCondition()) // not work because someBean is not already injected at this point
    private BeanInterface myEJB;

    @Inject
    SomeBean someBean;
}

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
public @interface MyOwnQualifier {
    SomeCondition condition();
}

public class BeanInterfaceFactory {
    @Produces
    @MyOwnQualifier(condition = RoleCondition.ADMIN) 
    public BeanInterface getBeanInterfaceEJBImpl() {
        return new BeanInterfaceEJBImpl();
    }
}

public enum RoleCondition {
    ADMIN("ADMIN User");
}

好吧,场景解释了。现在的问题是,我需要得到的值从某物Bean.get某物条件()返回一个Role条件,我的@MyOwnQualifer所必需的。但是此时有些Bean还没有被CDI注射。

我怎样才能让这条线起作用?

@Inject 
@MyOwnQualifier(condition = someBean.getSomeCondition()) // not work because some is not already injected at this point
private BeanInterface myEJB;

使用基于另一个注入的属性值的限定符动态注入bean的正确方法是什么?

共有1个答案

姚建树
2023-03-14

试试这个...

public class someManagedBean {

    @Inject 
    @MyOwnQualifier
    private BeanInterface myEJB;
}

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
public @interface MyOwnQualifier {
    SomeCondition condition();
}

public class BeanInterfaceFactory {

    @Inject
    SomeBean someBean

    @Produces
    @MyOwnQualifier
    public BeanInterface getBeanInterfaceEJBImpl() {
        if(someBean.getCondition()) {         
            return new BeanInterfaceEJBImpl();
        } else {
           ....
        }
    }
}

public enum RoleCondition {
    ADMIN("ADMIN User");
}
 类似资料:
  • 问题内容: 我试图将在Spring上下文中定义的bean注入到CDI托管组件中,但没有成功。不会注入Bean,而是在每次执行注入时都会创建一个新实例。我的环境是带有JBoss Weld的Tomcat 7。 Spring ApplicationContext很简单: CDI托管bean如下所示: 这是我的 但是,当我从JSF页面访问属性时,每次访问时都会创建一个新实例。这是一个简单的示例: 我得到以

  • 我正在尝试使用JAX-RS(泽西岛)创建一个简单的REST服务,而不使用Spring。我想要有典型的结构:资源,使用服务(典型接口与方法,查找全部...),并且该服务注入到资源中。 似乎CDI会自动扫描豆子并注入它们(在项目中有一个空),但是......它不适合我。 这是我的资源类: 这是我的服务及其impl类(这是一个模拟...): 我在这个类中使用了“无web.xml”配置: 我发现的唯一解决

  • 像这样上课: 有没有可能告诉Weld不要注射到c中?我可以否决使用事件的类: 但是B物体也不会被注射。我在搜索类似这样的东西:“如果类名是A,字段类型是C,那么省略注入。” 更具体地说,我希望HK2引擎注入“C”字段,问题是HK2和焊接都使用@注入注释。 我尝试了西利亚罗斯的解决方案。我找到了想要添加自定义注入实现的类型,比如: 在我添加了覆盖注入(…)在美国 比如: 在Manager eBVia

  • 问题内容: 我尝试@Inject这样的字段(它是一个jar模块,在META-INF下存在空bean.xml): IDataProvider接口 数据提供者实现import javax.enterprise.context.ApplicationScoped; 我尝试注入DataProvider的类 如果我在Wildfly上运行此命令,则注入的dataProvider始终为null(DataCont

  • 我对Java EE(依赖项注入)有点陌生,我不明白为什么@inject给我的是null,但是initialcontext.dolookup确实起作用。 这是我的豆子。它只是一把刀。EntityManager的包装器 --jar(PersonData-EJB模块-包含PersonManager) --war(PersonRest-web模块-包含PersonService)

  • 我是Xtext和Xtend的新手,正在尝试使用Xtext文档中的Xtext教程学习Xtext。我正在使用Xtext 2.14在Java10下运行Eclipse光子。我刚开始学习扩展教程,很早就遇到了一个问题。以下是我尝试使用代码生成器的代码: 这是我的语法文件: 我的问题是Eclipse说@Inject注释有问题,它说,这是在一个Eclipse Xtext项目中根据教程中的说明生成的。 我该如何从