2012-05-19 4 views
0

EJB 2.x 애플리케이션을 테스트하고있었습니다.ejb 모듈과 웹 모듈을 별도로 배포 할 때 Bean에 액세스 할 수 없습니까?

EJB 모듈 : 간단한 무 상태 세션 빈을

웹 모듈이 포함되어 EJB 모듈을 조회 할 수있는 단일 서블릿 페이지를 포함 I 별도로 2 모듈 를 만들었습니다. Jboss 4.2.3을 사용하고있었습니다.

처음으로, 나는 EJB 모듈을 배포했으며 배포가 원활하게 진행되었습니다. 두 번째으로 웹 모듈을 배포했으며 배포가 원활하게 진행되었습니다.

는 다음 나는 EJB 모듈을 조회하기 위해 다음 코드를 사용 :

Context c = new InitialContext(); 
Object o = c.lookup("HelloJNDI"); // Line 1 
HelloLocalHome rv = (HelloLocalHome) o; // Line 2 
HelloLocal local = rv.create(); 

는 검색이 잘 (Line 1)했다,하지만 Line 2 클래스 캐스트 예외를 생산했다.

은 그 때 나는이 개 시나리오에서 위의 코드를 테스트 : 나는 하나의 EAR module로 EJB와 웹 모듈을 패키지

  1. . 그런 다음이 EAR 모듈을 JBoss 4.2.3에 배포하고 위의 조회 코드는 매력처럼 작동했습니다.

  2. 나는 JBoss 5을 사용해 보았고 심지어 EJB 모듈과 웹 모듈을 개별적으로 배포했는데 위의 조회 코드는 훌륭하게 작동했습니다.

그렇다면 왜 JBoss 4에 2 개의 모듈을 별도로 배포했을까요? 2 개의 모듈이 같은 컨테이너에 배치 되었기 때문에 로컬 JNDI 조회 만 사용합니다. JBoss 4의 결함이 있습니까? 대신 캐스트의 다음 코드를 사용

+0

는 ClassCastException의 전체 스택 (또는 적어도 메시지가) 무엇을 제거 할 수 있습니까? o.getClass(), o.getClass(). getClassLoader() 및 HelloLocalHome.class.getClassLoader()의 값은 무엇입니까? –

답변

1

시도 : 그 지금 일 경우

HelloLocalHome rv = (HelloLocalHome)javax.rmi.PortableRemoteObject.narrow(o, HelloLocalHome.class); 

는, 당신은 악명 높은 클래스 로딩 문제가 있습니다. (JBoss 5의 기본 서버가 다른 클래스 로딩 메커니즘을 사용하는 이유 중 하나). 가장 쉬운 방법은 실제로 단일 EAR에 배치하는 것입니다 (홈 및 원격 클래스가 한 번로드됩니다). 웹 어플리케이션의 Home 인터페이스 클래스는 JNDI가 리턴 한 것과 다른 클래스 로더에 의해로드됩니다.

당신은 또한 당신의 WAR 파일의 클래스의 인터페이스 나 LIB dirrectory

+0

시도했지만 여전히 작동하지 않습니다. – ipkiss

+0

답변을 업데이트했습니다. –