java - CDI 将 EJB 注入(inject) Glassfish v3 上的 POJO

标签 java ejb glassfish-3 cdi ejb-3.1

是否可以在 Glassfish v3 上使用 CDI 将 EJB 3.1 bean 注入(inject)到 POJO 中?

我的类(在 EJB 模块中):

@Singleton
@LocalBean
@Startup
@Named
public class NewSingletonBean {

    @PostConstruct
    public void init(){
        System.out.println("NewSingletonBean INIT");
    }

}

_

@Singleton
@LocalBean
@Startup
@DependsOn(value="NewSingletonBean")
public class NewSingletonBean2 {

    @Inject NewSingletonBean newSingletonBean;

    @PostConstruct
    public void init(){
        System.out.println("NewSingletonBean2 INIT");
        System.out.println("EJB injected into EJB: " + (newSingletonBean != null));
        MyPOJO p = new MyPOJO();
        p.sth();
    }

}

_

public class MyPOJO {
        @Inject NewSingletonBean newSingletonBean;

        public void sth(){
            System.out.println("EJB injected into POJO: " + (newSingletonBean != null));
        }
}

服务器输出:

Launching GlassFish on Felix platform
INFO: Registered org.glassfish.ha.store.adapter.cache.ShoalBackingStoreProxy for persistence-type = replicated in BackingStoreFactoryRegistry
INFO: Grizzly Framework 1.9.31 started in: 31ms - bound to [0.0.0.0:4848]
INFO: Grizzly Framework 1.9.31 started in: 109ms - bound to [0.0.0.0:8080]
INFO: Grizzly Framework 1.9.31 started in: 62ms - bound to [0.0.0.0:8181]
INFO: Grizzly Framework 1.9.31 started in: 141ms - bound to [0.0.0.0:3700]
INFO: Grizzly Framework 1.9.31 started in: 0ms - bound to [0.0.0.0:7676]
INFO: GlassFish Server Open Source Edition 3.1 (43) startup time : Felix (2 812ms), startup services(1 172ms), total(3 984ms)
INFO: JMXStartupService: Started JMXConnector, JMXService URL = service:jmx:rmi://9.167.213.195:8686/jndi/rmi://9.167.213.195:8686/jmxrmi
INFO: Hibernate Validator 4.1.0.Final
INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
INFO: Grizzly Framework 1.9.31 started in: 16ms - bound to [0.0.0.0:8080]
INFO: Grizzly Framework 1.9.31 started in: 16ms - bound to [0.0.0.0:8181]
INFO: SEC1002: Security Manager is OFF.
INFO: SEC1010: Entering Security Startup Service
INFO: SEC1143: Loading policy provider com.sun.enterprise.security.provider.PolicyWrapper.
INFO: SEC1115: Realm [admin-realm] of classtype [com.sun.enterprise.security.auth.realm.file.FileRealm] successfully created.
INFO: SEC1115: Realm [file] of classtype [com.sun.enterprise.security.auth.realm.file.FileRealm] successfully created.
INFO: SEC1115: Realm [certificate] of classtype [com.sun.enterprise.security.auth.realm.certificate.CertificateRealm] successfully created.
INFO: SEC1011: Security Service(s) Started Successfully
INFO: WEB0169: Created HTTP listener [http-listener-1] on host/port [0.0.0.0:8080]
INFO: WEB0169: Created HTTP listener [http-listener-2] on host/port [0.0.0.0:8181]
INFO: WEB0169: Created HTTP listener [admin-listener] on host/port [0.0.0.0:4848]
INFO: WEB0171: Created virtual server [server]
INFO: WEB0171: Created virtual server [__asadmin]
INFO: WEB0172: Virtual server [server] loaded default web module []
INFO: Portable JNDI names for EJB NewSingletonBean2 : [java:global/CDITest/CDITest-ejb/NewSingletonBean2!tries.NewSingletonBean2, java:global/CDITest/CDITest-ejb/NewSingletonBean2]
INFO: Portable JNDI names for EJB NewSingletonBean : [java:global/CDITest/CDITest-ejb/NewSingletonBean!tries.NewSingletonBean, java:global/CDITest/CDITest-ejb/NewSingletonBean]
INFO: WELD-000900 ${parsedVersion (osgiVersion})
INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
INFO: NewSingletonBean INIT
INFO: NewSingletonBean2 INIT
INFO: EJB injected into EJB: true
INFO: EJB injected into POJO: false
INFO: WEB0671: Loading application [CDITest#CDITest-war.war] at [CDITest-war]
INFO: CDITest was successfully deployed in 3 531 milliseconds.

注释行:

INFO: EJB injected into EJB: true
INFO: EJB injected into POJO: false

所以看起来 @Inject 到 EJB 中工作正常,但到 POJO 中却不行。我究竟做错了什么? 我试过 GlassFish 3.1 和 3.0.1(使用 NetBeans 7.0.1)。

编辑: 我正在使用 NetBeans 7.0.1。 dist目录结构:

│   CDITest.ear
│
└───gfdeploy
    └───CDITest
        ├───CDITest-ejb_jar
        │   │   .netbeans_automatic_build
        │   │   .netbeans_update_resources
        │   │
        │   ├───META-INF
        │   │       beans.xml
        │   │       MANIFEST.MF
        │   │
        │   └───tries
        │           MyPOJO.class
        │           NewSingletonBean.class
        │           NewSingletonBean2.class
        │
        ├───CDITest-war_war
        │   │   index.jsp
        │   │
        │   ├───META-INF
        │   │       MANIFEST.MF
        │   │
        │   └───WEB-INF
        │       └───classes
        │               .netbeans_automatic_build
        │               .netbeans_update_resources
        │
        └───META-INF
                MANIFEST.MF

解压后的 EAR 结构:

│   CDITest-ejb.jar
│   CDITest-war.war
│
└───META-INF
        MANIFEST.MF

解压后的 EJB 模块 jar 结构:

├───META-INF
│       beans.xml
│       MANIFEST.MF
│
└───tries
        MyPOJO.class
        NewSingletonBean.class
        NewSingletonBean2.class

最佳答案

我对 CDI 不是很熟悉,但我想如果您自己创建 POJO 对象,则不会发生注入(inject)。你试过了吗:

@Inject
private MyPOJO p;

代替:

MyPOJO p = new MyPOJO();  

?

关于java - CDI 将 EJB 注入(inject) Glassfish v3 上的 POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8165482/

相关文章:

tomcat - 从 Tomcat 连接到 JBoss 7.1.1 中的 EJB 时,JNDI 查找失败

jsf-2 - 如何摆脱警告:PWC4011:无法将请求字符编码设置为UTF-8

java - 如何读取文件并按行分割文本?

java - jfreechart xyplot 设置小区域背景色

java - 相对于应用程序路径的 Tomcat log4j 日志记录?

performance - 从 NetBeans 到 Glassfish 的部署非常慢

maven-2 - Maven 嵌入式 Glassfish 插件 - 如何设置临时目录?

java - 如果在设定的时间段后无法找到页面上的文本,Selenium Webdriver Java 代码将显示消息

java - EJB容器中RuntimeException和@ApplicationException(rollback=true)Exception的区别

java - WAS 7.0.0.23 - MDB 中带有激活规范的默认拦截器会抛出 classcastException