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의 로컬 인터페이스에 선언해야합니다 :