문제
나는 지금 가지고있어
ear
|----test.jar
|-------META-INF
|-------application.xml
|-------test
|-------Test.class
|-------TestEJB.class
|-------TestHome.class
|----test.war
|-------WEB-INF
|-------web.xml
|-------test
|-------TestServlet.class
application.xml
<application>
<display-name>Ejb Test</display-name>
<module>
<ejb>test.jar</ejb>
</module>
<module>
<web>
<web-uri>test.war</web-uri>
<context-root>/test</context-root>
</web>
</module>
</application>
web.xml
<web-app>
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>test.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
작업 귀 애플리케이션에서 누락 된 것이 있습니까? 이러한 구성 파일의 목적은 무엇입니까? 서블릿에서 EJB의 서비스에 어떻게 액세스합니까?
해결책
EJB 배치 디스크립터가 필요합니다 test.jar/META-INF/ejb-jar.xml
그리고 EAR 배치 디스크립터가 가야합니다 your.ear/META-INF/application.xml
(아니다 EJB 항아리 안에!).
ejb-jar.xml에는 ejbs에 대한 다음 xml 조각과 같은 것이 포함됩니다.
<enterprise-beans>
<session>
<ejb-name>MyCoolEJB</ejb-name>
<local-home>test.TestHome</local-home>
<local>test.Test</local>
<ejb-class>test.TestEJB</ejb-class>
</session>
<!-- ... more <session/> or <entity/> entries ... -->
</enterprise-beans>
나는 EJB3 직접 일했는데, 여기서 상황이 조금 다르고 더 이상 홈 인터페이스가 없습니다. 그러니 소금 한 덩어리로 내 예를 들어보세요.
web.xml 내부에 EJB에 대한 해당 참조가 있어야합니다.
<ejb-local-ref>
<ejb-ref-name>TheJNDINameOfYourEJB</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<ejb-link>MyCoolEJB</ejb-link> <!-- the value from <ejb-name/> above -->
</ejb-local-ref>
그만큼 <ejb-link/>
해당하는 것을 가리 킵니다 <ejb-name/>
귀하의 EJB의 경우, 귀하의 참조가 EJB와 동일한 항아리에있는 경우. 그렇지 않으면 항아리의 이름을 다음과 같은 <ejb-link>test.jar#MyCoolEJB</ejb-link>
.
그런 다음 서블릿에서 "Java : Comp/Eng/thejndinameofyourejb"에 대한 JNDI 조회를 수행하여 EJB의 홈 인터페이스에 액세스 할 수 있습니다. 나는 당신에게 더 깊이 파고 들기 위해 당신에게 몇 가지 포인터를 주었으면 좋겠다.
BTW : EJB 2.X가 고정 된 요구 사항이 아닌 경우 EJB 3.X를 살펴보십시오. 그 버전에서 많은 것들이 더 쉬워졌습니다!
다른 팁
EJB는 잘 포장되지 않은 것처럼 보이지 않습니다. 자체 EJB 모듈에 있어야하며 EJB 배포 디스크립터 (EJB-Jar.xml 파일)를 볼 수 없습니다. 살펴보십시오 포장 응용 프로그램 그리고 EJB 모듈 JAR 파일의 디렉토리 구조