CDI introduces EJB to POJO on Glassfish v3

Is it possible to introduce EJB 3.1 beans in POJO using CDI on Glassfish v3?

My classes (in the EJB module):

@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)); } } 

Server output:

 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. 

Note:

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

So, it looks like @Inject in EJB works fine, but in POJO not. What am I doing wrong? I tried GlassFish 3.1 and 3.0.1 (with NetBeans 7.0.1).

EDIT: I am using NetBeans 7.0.1. The directory structure dist:

 CDITest.ear │ └───gfdeploy └───CDITest ├───CDITest-ejb_jar │ │ .netbeans_automatic_build │ │ .netbeans_update_resources │ │ │ ├───META-INF │ │ beans.xml │ │ MANIFEST.MF │ │ │ └───triesMyPOJO.classNewSingletonBean.classNewSingletonBean2.class │ ├───CDITest-war_war │ │ index.jsp │ │ │ ├───META-INF │ │ MANIFEST.MF │ │ │ └───WEB-INF │ └───classes.netbeans_automatic_build.netbeans_update_resources │ └───META-INF MANIFEST.MF 

Unpacked EAR structure:

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

EJB Open Package Container Structure:

 ├───META-INFbeans.xmlMANIFEST.MF │ └───tries MyPOJO.class NewSingletonBean.class NewSingletonBean2.class 
+2
source share
2 answers

I am not very familiar with CDI, but I think if you create a POJO object yourself, the injection will not happen. You tried:

 @Inject private MyPOJO p; 

Instead:

 MyPOJO p = new MyPOJO(); 

?

+5
source

Well, I can inject EJBs (and other resources) into classes other than EJBs (like Servlets and DAO) using @EJB or @Inject. Normally you should use @EJB to enter ejb and @Inject to inject a resource other than ejb.

Also, do not forget about the beans.xml file, this is necessary to activate CDI:

http://download.oracle.com/javaee/6/tutorial/doc/gjbnz.html

I think this may be your problem. The absence of this file actually deactivates the CDI, but you still get the stuff you inject into your EJBs only because it is possible even in versions of previous versions of Java EE.

+2
source

Source: https://habr.com/ru/post/1381665/


All Articles