2010-05-18 5 views
3

@ ejb 주석을 사용하여 ejb.jar 파일의 EJB에 대한 원격 참조를 주입하려고하는 응용 프로그램이 있습니다. 일관성없는 결과가 나타납니다. 하나의 경우, 나는 web.xml에 청취자가 있는데, EJB에 연결하고 메소드를 호출하는 것을 볼 수 있기 때문에 호출 된 EJB가 올바르게 주입되었다. 다른 클래스 (struts2 작업)에서는 EJB 참조에 액세스하려고 할 때 NPE를 얻습니다. 내가 알 수있는 한, 동일한 .war 파일에있는 Java 클래스에서 동일한 호출입니다.Glassfish 웹 응용 프로그램에서 EJB 삽입

해결 방안으로 전역 JNDI 이름으로 EJB를 조회하는 코드를 생성자에 추가하여 정상적으로 작동합니다. 왜 @EJB가 작동하는지 아닌지를 파악할 수 없습니다.

답변

3

Struts 2 작업에서 EJB를 어떻게 주입합니까? CDI를 사용하고 있습니까? Struts2 CDI plugin을 사용하고 있습니까?

업데이트 : 문제는 컨테이너가 Struts 개체를 생성하지 않는다는 것입니다. 따라서 Struts는 컨테이너에 아무것도 주입 할 기회가 없습니다. 당신이 언급 한 plugin for CDI을 사용하여 당신의 행동을 주입 할 수 있어야합니다.

당신은 스트럿츠 2 소스를 얻을, 그것을 시도를 제공 할 경우 : struts2 디렉토리에

svn co http://svn.apache.org/repos/asf/struts/struts2/trunk/ struts2 
다음

cd을하고 다음 명령을 실행

(이것은 struts-cdi-plugin에 필요한 모듈을 컴파일)
mvn install -pl plugins -am 

그런 다음 CDI-플러그인의 소스를 얻을 :

svn co https://svn.apache.org/repos/asf/struts/sandbox/trunk/struts2-cdi-plugin/ 

그리고 컴파일 :

mvn install 

을 이제 내 pom.xml 파일에 다음 종속성 :

<dependency> 
    <groupId>org.apache.struts</groupId> 
    <artifactId>struts2-core</artifactId> 
    <version>2.2.0-SNAPSHOT</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.struts</groupId> 
    <artifactId>struts2-cdi-plugin</artifactId> 
    <version>2.2.0-SNAPSHOT</version> 
</dependency> 
<dependency> 
    <groupId>javassist</groupId> 
    <artifactId>javassist</artifactId> 
    <version>3.8.0.GA</version> 
</dependency> 

나는 액션에 주입 된 EJB 얻을 수있었습니다 :

public class HelloWorld extends ActionSupport { 

    @Inject 
    HelloEJB helloEjb; 

    @Override 
    public String execute() throws Exception { 
     setMessage(helloEjb.getMessage()); 
     return SUCCESS; 
    } 

    private String message; 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    public String getMessage() { 
     return message; 
    } 

} 

예를 들어 https://svn.apache.org/repos/asf/struts/sandbox/trunk/struts2-cdi-example/을 참조하십시오.

+0

아니오, 그냥 곧은 @EJB 주석입니다. – g051051

+0

설명해 주셔서 감사합니다. 이것은 청취자가 (web.xml 항목에서 컨테이너에 의해 인스턴스화 된) 리스너가 왜 작동하지만 스트럿츠에 의해 인스턴스화 된 내 작업이 왜 실패했는지 설명합니다. 방금 주석 달린 클래스가 어떤 종류의 클래스 로더 부두를 통해 처리 될 것이라고 가정했습니다. 이런 종류의 것이 문서화되어 있습니까? – g051051

+0

@ g051051 리스너는 소위 "관리되는"구성 요소이며 주입이 작동합니다 (예 : Java EE 5, http://java.sun.com/developer/technicalArticles/J2EE/intro_ee5/#injection을 참조하십시오). Java EE 6는 CDI를 사용하여 POJO에서 주입을 가능하게함으로써 이러한 한계를 뛰어 넘습니다 (그러나 CDI 또는 CDI "인식"프레임 워크를 사용해야합니다). –

관련 문제