@EJB?

2010-07-20 2 views
4

저는 지금 당분간이 문제에 시달렸습니다.@EJB?

EJB 3.0을 준비하려고합니다. 내 응용 프로그램 서버로 JBoss 5.1.0 GA를 사용하고 있습니다. 로컬 인터페이스를 가진 매우 단순한 상태 비 저장 세션 빈과 세션 빈 메소드를 호출하는 간단한 jsp-servlet 클라이언트로 시작했다. 이 모든 동안 나는 @EJB 어노테이션을 사용하여 세션 빈을 서블릿 클래스에 주입하려고 시도했다.

public class SampleServlet extends HttpServlet { 

    @EJB 
    private PersonLocal person; 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
     System.out.println("In servlet");  
     response.getWriter().write("Person Name : "+person.getName()); 
     System.out.println(person.getName());  
    } 
} 

나는 기본 구성 보스 5.1.0 GA를 사용하고 있습니다. (모두 구성으로 시도했습니다.)

그러나 세션 빈 주입에 null 참조를 사용했습니다. 하루 정도 고생 한 끝에 나는 jndi.properties 파일에 지정된 jndi에 대한 구성으로 @EJB 주석 대신 추악한 EJB 2.x JNDI 조회 방법을 시도했으며 다른 변경 없이도 작동했습니다!

이제 JBoss 5.1.0 GA가 @EJB 주석을 사용하여 주입을 지원하는지 여부를 JBoss 문서에서 확인하려고했지만 구체적인 대답을 찾을 수 없습니다. 누군가가 나에게 그런 말을 할 수 있습니까? JNDI 조회에 대한 주석을 정말로 선호하기 때문에 (나는 의미하지 않는다.). 나는 뭔가를 놓치고 ..?

은 아마 보스 포럼에 넣고 뻔했지만 .. 나는 자바 EE 5 인증을 획득 때문에 확실히 보스 5.x를 지원하는

+0

어떤 JBoss 서버 구성을 사용하고 있습니까? 'all','default','minimal' 등이 있습니다. – skaffman

+2

또한 몇 가지 코드를 보여주십시오. 서블릿 – skaffman

+0

이 코드와 서버 구성을 질문에 추가했습니다. :) – Nikhil

답변

5

이 곳 ;-)에 중독입니다.

사실, JBoss EJB3 TutorialsChapter 11. Introduction to EJB injection in Servlets을 확인하는 것이 좋습니다. 단계별 예제를 자세하게 설명합니다.

그리고 다음 주에 특히주의 : 당신의 web.xml이 웹 응용 프로그램 XSD의 2.5 버전을 사용해야합니다 웹 모듈에서 일어날 수있는 주사를 들어

:

<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
+3

그래서 얼마나 많은 서블릿/JSP로 질문이'웹 애플 리케이션 버전'을 수정하여 해결되었습니다 ..... – skaffman

+1

그게 고정! :) 다이빙하기 전에 튜토리얼을 읽었어야했는데 어쨌든 .. 나는 좋은 교훈을 얻었습니다. 많이 감사합니다! :) – Nikhil

+0

일반 자바 클라이언트를 사용할 때 이와 유사한 다른 gotacha가 있습니까? 또는 Java 클라이언트에 그대로 삽입 할 수 있습니까? – Nikhil

1

나는 원격 EJB를 사용하여 비슷한 문제를 가지고 있지만, 웹 응용 프로그램의 버전으로 인해 아니었지만, 오히려 내 클라이언트는 EJB를 찾고 있었던 방법에 대해 설명합니다. (메이븐 빌드) 내 프로젝트에 대한

//bean 
@Stateless(name="xxxxService") 
@Remote(xxxxRemote.class) 
public class xxxxService implements xxxxRemote { 

//interface - note that no annnotation is required 
public interface xxxxRemote { 

//in the client 
    @EJB(mappedName="myJndiNameForxxxx") //for a local ejb, you could use 'beanName=' 
    private xxxxRemote xxxx; 

는, 클라이언트가 웹 애플리케이션에, 그리고 EJB는 다음 EAR 프로젝트에 싸여되는 EJB 프로젝트에 있습니다

여기에 나를 위해 일한거야. 의 JNDI 맵핑이 EJB 프로젝트에 살고있는,의 jboss.xml에서 발생 (내 프로젝트에서, SRC/메인/자원/META-INF), 그리고는 다음과 같습니다 : 지금

<?xml version="1.0" encoding="UTF-8"?> 
<jboss xmlns:xs="http://www.jboss.org/j2ee/schema" 
     xs:schemaLocation="http://www.jboss.org/j2ee/schema/jboss_5_0.xsd" 
     version="5.0"> 
    <enterprise-beans> 
    <session> 
     <ejb-name>xxxxService</ejb-name> 
     <jndi-name>myJndiNameForxxxx</jndi-name> 
    </session> 
    </enterprise-beans> 
</jboss> 
이 걸렸다 전부

등을 클라이언트에서 EJB에 액세스 할 수 있습니다. 희망이 사람을 도움이됩니다.

여전히 문제가있는 경우 JMX 콘솔에서 JNDI 항목이 표시되는지 확인할 수 있습니다. 'jboss'> 'service = JNDIview'> 'list'를보고 'invoke'버튼을 클릭하십시오. 서비스가 올바르게 배치되면 JNDI 이름 (예 : myJndiNameForxxxx)이 'ProxyFactory'아래에 있어야합니다.

+0

당신의 대답은 묻는 질문과 관련이 없지만 여전히 당신이 말한 것처럼 누군가에게 도움이 될 수 있습니다! – Nikhil