2011-11-17 3 views
2

Glassfish v3에서 CDI를 사용하여 EJB 3.1 beans를 POJO에 주입 할 수 있습니까? (EJB 모듈)CDI가 Glassfish v3의 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 

은 그래서 EJB에 @Inject처럼 보인다는 잘 작동하지만 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 모듈 항아리 구조 :

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

답변

5

나는 CDI에 익숙하지 않지만, POJO 객체를 직접 만들면 주입이 발생하지 않을 것입니다. 당신은 시도해 봤어 :

@Inject 
private MyPOJO p; 

대신에 :

MyPOJO p = new MyPOJO(); 

?

+0

당신 말이 맞아요. 그것은'@Inject private MyPOJO p;와 작동합니다. 그래서 그것은 올바른 행동입니까? – zacheusz

+2

@zacheusz 클래스의 인스턴스를 직접 만들면 컨테이너의 수명주기에 대한 책임이 없습니다. 책임이 없으므로 주입이 발생하지 않습니다. –

+0

@PiotrNowicki 많이 감사합니다 :) – zacheusz

2

그럼 내가 EJB를 (및 기타 자원)를 주입 할 수있어에서 @EJB 또는 @Inject를 사용하여 비 EJB 클래스 (서블릿 및 DAO와 같은). 일반적으로 @EJB를 삽입하려면 @EJB를, 비 ejb 자원을 주입하려면 @Inject를 사용합니다. 은 "beans.xml 환경"파일에 대해 잊지 마세요 또한

는, 이것은 CDI를 활성화 할 필요가 :

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

나는이 문제가 될 것 같아요. 사실이 파일을 잃어 버리면 CDI가 비활성화되지만 여전히 CDE 버전의 Java EE에서도 가능하기 때문에 여전히 EJB에 정보를 주입하고 있습니다.

+0

감사합니다. EJB 모듈 jar 아카이브의 META-INF 디렉토리에 beans.xml이 있습니다. POJO : @ public class MyPOJO {@EJB NewSingletonBean newSingletonBean;}에서 @EJB를 사용하면 작동하지 않습니다. – zacheusz

+0

@ Shivan 나는 또한 beans.xml로 시도했지만 여전히 null이다. – user2771655