手动将CDI组件注入非托管类Java EE

时间:2014-03-20 10:43:33

标签: java-ee jboss7.x cdi inject

我在非托管类中有一个方法。此方法返回另一个类的对象。根据上下文(如果此类在Java EE上下文中),它应返回不同的对象。在Java EE上下文中,它应该返回正确的注入实例,否则它应该返回一个代理。

public class TestHelperConnector {
    public TestHelper getInstance(){
        try {
             // problem: the BeanManager is never found
             BeanManager beanManager = (BeanManager) new InitialContext().lookup("java:comp/BeanManager");
             return beanManager.getBeans(TestHelper.class);
        } catch (NameNotFoundException e) {
            // no bean manager -> no Java EE context (?)
            TestHelper testHelperProxy = ... do jmx connection
            return testHelper;
        }
    }
}

所以proxi正在工作,但始终如此。我从来没有得到BeanManager的实例。即使我们从托管班级打电话。

@Stateless
public class Foo {
    public void doIt() {
        // problem: we never get the injected instance, he always creates the proxy
        TestHelper testHelper = new TestHelperConnector().getInstance();
    }
}

背景:我们正在使用一个TestHelper类,它包含大量支持测试的方法。 TestHelper用于单元以及集成(arquillian)测试以及验收(硒)测试。 TestHelper是如此集成,以至于一直手动选择它是一件痛苦的事情所以我们需要一种方法来自动获取正确的实例,无论我们是否在Java EE上下文中。

系统:jBoss 7.1.1.Final

为什么我们不获取BeanManager实例? 我们现在有更好的方式吗?

2 个答案:

答案 0 :(得分:2)

查看DeltaSpike中的BeanProvider课程。如果我理解了一切,我们应该有一些东西可以帮助你做你想做的事。

答案 1 :(得分:1)

我找到了一个糟糕的解决方法,我不确定我是否应该分享这个...但它有效:)

因此,如果它在jboss中运行,它将在启动时加载并将其实例设置为由getInstance()传递的静态变量。如果不是,则不会初始化此变量并加载代理:

@Singleton
@Startup
public class TestHelperConnector {
    private static TestHelperMBean instance;

    @Inject
    private TestHelperMBean testHelper;

    @PostConstruct
        private void initInjectedTestHelper() {
        instance = testHelper;
    }

    public static TestHelperMBean getInstance() {
        if (instance == null) {
             instance = getProxyInstance();
        }
        return instance;
    }

    private static TestHelperMBean getProxyInstance() {
        // creating proxy ...
        return ...;
    }
}