【问题标题】:Manual injection of CDI component into a non managed class Java EE将 CDI 组件手动注入非托管类 Java EE
【发布时间】:2014-04-27 03:33:51
【问题描述】:

我在非托管类中有一个方法。此方法返回另一个类的对象。根据上下文(如果此类是否在 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;
        }
    }
}

所以代理正在工作,但一直在工作。我从来没有得到 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 实例? 有没有比我们目前做的更好的方法?

【问题讨论】:

    标签: jakarta-ee jboss7.x cdi inject


    【解决方案1】:

    看看 DeltaSpike 中的 BeanProvider 类。如果我对所有内容的理解都正确,我们应该有一些东西可以帮助你做你想做的事情。

    【讨论】:

    • 在我看来,这应该被标记为正确的答案。您可以在类中使用 thr 静态方法来获取所需会话范围 bean 的代理,就像 @Inject 一样。 BeanProvedr.getContextualReference()。适用于任何 pojo - 刚刚尝试过。
    【解决方案2】:

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

    因此,如果它在 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 ...;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 2018-06-22
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多