2011-05-14 5 views
7

CDI 옵저버 메서드가있는 Singleton EJB (javax.ejb.Singleton 버전. sigh.)가 있습니다. 이것을 glassfish 3.1에 배포하려고 시도 할 때 실제 설명없이 서버가 EAR 파일을 배포하지 못합니다. 더 이상 세부 사항없이 배포하는 동안 예외가 발생했다는 말입니다.CDI 이벤트 관찰자 메소드가 EJB와 호환 가능합니까?

public void updateFromGranule(@Observes @CloudMask GranuleAvailableEvent granuleEvent) { 
    LOG.info("updating cloud map"); 
    update(granuleEvent.getGranule(), CloudMask.class); 
    fireUpdate(); 
} 

난 그냥 응용 프로그램은 미세 배포 @ApplicationScoped 콩으로 싱글 톤 빈을 변경하는 경우 :

SEVERE: Exception while loading the app 
SEVERE: Exception while shutting down application container 
.... 
SEVERE: Exception while shutting down application container : java.lang.NullPointerException 

이는 CDI 이벤트 리스너입니다. 마찬가지로 CDI 이벤트 관찰자 방법을 제거하면 응용 프로그램이 잘 배포됩니다. EJB의 트랜잭션, 스레드 안전성 등을 원하기 때문에 실제로 클래스를 EJB 싱글 톤으로해야하기 때문에 이것을 @ApplicationScoped POJO로 남겨 두는 것은별로 유용하지 않습니다. 문제는 Singleton Bean에 국한되지 않는 것 같습니다. - 주석을 @Stateless 및 @Stateful로 변경하여 실험했으며 동일한 문제가 발생했습니다.

이것이 Weld의 버그 일 수 있습니다. 아마도 Weld와 EJB는 그 메소드를 프록시하는 방법에 대해 싸워 왔습니다. 아마도 EJB는 스레드 안전성을 보장하기 위해 인터셉터 클래스를 추가하고 해당 메소드를 래핑해야 할 수 있습니다. 이벤트 리스너를 작동시키기 위해 다른 작업을하려고합니까?

나는 여기에 대해 오해하고 있으며, CDI 이벤트 핸들러는 EJB에서 사용되지 않아야한다. (이 경우 글래스 피시의 오류 메시지가 더 좋아야한다.) 아니면 실제로 이것은 CDI 또는 EJB 구현의 버그 일 뿐인가? EJB를 로컬 인터페이스를 선언하는 경우

CDI 관찰자 방법이 분명히 정적 또는 EJB의 로컬 인터페이스에 선언해야합니다 :

답변

5

나는이 답이라고 생각합니다. 내 EAR 파일을로드 할 때 제대로이 예외를보고하지 않는 몇 가지 이유 글래스 피쉬의 경우

org.jboss.weld.exceptions.DefinitionException: WELD-000088 Observer method must be static or local business method: [method] public org.stain.ObserverBean.testMethod(EventClass) on [email protected] class org.stain.ObserverBean 

을 단순히 : 로컬 인터페이스에없는 관찰자 방법을 선언하려고 일반적으로하는 경우는 다음과 같이 용접에서 예외가 Exception while loading the app라고합니다.

로컬 인터페이스에 메서드를 추가하거나 클래스의 인터페이스 선언을 제거하면 문제가 해결되고 응용 프로그램을 정상적으로로드 할 수 있습니다.

3

용접의 최신 버전에서 같은 문제가 나타났습니다. 그러나 @LocalBean 주석을 추가하면 @Singleton 및 @Singleton @Startup과 함께 작동합니다.

관련 문제