有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在EJB3.1中控制CDI启动的java

我是新来的,也不熟悉CDI世界,我在工作中的第一个任务就是找到一种控制CDI上传的方法

我们同时使用EJB 3.1CDI 1.0,因为它们由不同的容器控制,所以我们可以通过使用@Startup@Singleton注释来控制EJB管理的bean何时以及以何种顺序启动

但是我在类中声明的@Injectcdibean是空的,因为CDI容器还没有启动

几天来,我一直在寻找解决方案,但我发现here不起作用(仍然是空的)

我们正在使用JavaEE6并在WebSphereApplicationServer8上运行应用程序

请,如果你能帮我找到一种方法来控制CDI在内部的上传,而不考虑EJB

下面是它的示例代码:

import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;

@Singleton
@Startup
public class BaseStartupLoader{


/**
 * Default constructor. 
 */
@Inject @MyStartup
BaseStartUp myStartup;

private static Logger m_logger = LoggerFactory.getLogger(BaseStartupLoader.class);
public BaseStartupLoader() {

}

@PostConstruct
public void init(){

    String applicationName = null;

    try {

            applicationName = myStartup.getClass().getName();
            myStartup.load();

    } catch (IllegalAccessException e) {
        m_logger.error("Faild to load data into preload system. "+e);               
    } catch (InstantiationException e) {
        m_logger.error("Faild to load data into preload system. "+e);               
    } catch (ClassNotFoundException e) {
        m_logger.error("Faild to load data into preload system - Class "+ applicationName + "Not found. "+e);               
    }
  }
}

下面是BaseStartup接口:

public interface BaseStartUp {
public void load() throws IllegalAccessException, InstantiationException, ClassNotFoundException;
}  

限定符和实现:

@Retention(RetentionPolicy.RUNTIME)
@Target ({ElementType.PARAMETER, ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
@Qualifier 
@Dependent
public @interface MyStartup {   
}


@MyStartup
public class MyStartUpLoader implements BaseStartUp {

    @Inject
    SomeConfigLoader config;

    @Override
    public void load() throws IllegalAccessException, InstantiationException, ClassNotFoundException {
    conifg.init();      
}   
}

共 (3) 个答案

  1. # 1 楼答案

    经过大量研究,我从IBM的同事那里得到了一些帮助,因为我们正在使用WebSphere Application Server,所以我可以添加一个JVM属性,名为:

    “com.ibm.ws.cdi.immediate.ejb.start”=true

    到管理控制台中的WAS,他将确保一旦我进入我创建的@startupbean中的EJB@PostConstruct方法,CDI容器将已经启动并运行,并且已经注入

    它起作用了

    以下是指向IBM站点中的问题和解决方案的链接:

    http://www-01.ibm.com/support/docview.wss?uid=swg1PM62774

  2. # 2 楼答案

    可能需要再次检查CDI是否在应用程序需要的所有位置都已启用。尝试将此代码添加到BaseStartupLoader作为实验:

    @Singleton
    @Startup
    public class BaseStartupLoader {
    
        @Inject @MyStartup
        BaseStartUp myStartup;
    
        @Inject
        private InjectionTest test;
    
    
        public static class InjectionTest {}
    }
    

    如果test变量在@PostConstruct中出现null,那么在声明BaseStartupLoader的jar中可能没有启用CDI

    例如,如果在名为orange.jar的jar中声明了BaseStartupLoader,而在名为yellow.jar的jar中声明了MyStartUpLoader,则这两个文件必须存在:

    • orange.jar!/META-INF/beans.xml
    • yellow.jar!/META-INF/beans.xml

    如果通过META-INF/beans.xml在两个JAR中正确启用了CDI,那么这就是容器中的错误。在调用@PostConstruct之前,需要完成所有@Inject点(对于启用CDI的JAR)。无论是否使用了@Startup并且其中一个bean恰好是EJB,这都是正确的

  3. # 3 楼答案

    看看德尔塔斯派克。有一个CDI控制模块,可以满足您现在的需求。我相信JavaEE7也应该解决这个问题