2012-10-20 4 views
1

먼저 여기에서 수행하려고하는 것을 설명 할 것입니다. 데이터를 주기적으로 읽고, JBoss AS 7.1.1에서 stateless EJB를 호출하여 추가 연산 (데이터 계산 및 DB에 저장)을 수행하는 Java 응용 프로그램이 있습니다. JSF 2.0을 사용하는 프런트 엔드가 있습니다. @ApplicationScoped CDI 빈이고 JSF 프로젝트에 상주하는 컨트롤러에서 EJB를 주입한다. 이제 DB에서 데이터를 가져 오기 위해 EJB가 필요합니다. 나는이 때문에 이유 @ApplicationScoped CDI 빈을 사용하고 있습니다 :응용 프로그램 범위 지정 CDI 빈을 상태 비 저장 EJB bean에 삽입

상황 가 모든 서블릿 요청, 웹 서비스 호출, EJB 원격 메소드 호출, EJB 비동기 메소드 호출, EJB 시간 제한 및 메시지 배달간에 공유되는 응용 프로그램 동일한 응용 프로그램 내에서 실행되는 메시지 구동 Bean 응용 프로그램이 종료되면 응용 프로그램 컨텍스트가 손상됩니다.

데이터가 사용자와 독립적이므로 모든 클라이언트에 대해 하나의 CDI bean 만 원합니다.

EJB bean의 도움으로 JSF 프로젝트에서 정의 된 @ApplicationScoped CDI 빈에서 데이터를 업데이트하고 싶습니다.이 메소드는 새 데이터가 도착할 때 실행됩니다. EJB 프로젝트에서 EJB를 주입 한 @ApplicationScoped CDI 빈에서 @Inject를 이미 성공적으로 사용했습니다. 이제 나는 다른 길을 가고 싶다. JSF 프로젝트의 ApplicationScoped CDI 빈을 EJB 빈에 삽입하려고 시도했다.

@Inject 
private CurrentDataController currentDataController; 

경고는 다음과 같습니다 :이 쓴하지만 경고로 밑줄 @Inject 가지고

없음 빈이 주입 지점에 주입을받을 수 없다 [JSR-299 §5.2.1]

프로젝트를 게시하려고하면 클래스에 대한 오류가 발생합니다. 예외는 CurrentDataController에 대해입니다.

에 의한 : java.lang.ClassNotFoundException가 :에서 controllers.CurrentDataController [모듈 "deployment.TestEAR.ear.TestEJB.jar : 주를"서비스 모듈 로더에서]를

그것은 EJB 보인다 프로젝트가 JSF 프로젝트에서 클래스를 참조 할 수 없습니다. 또한 TestJSF.jar 대신 TestEJB.jar에서 CurentDataController 클래스를 찾고 있습니다. 여기서 내가 무엇을 놓치고 있니?

내 전체 프로젝트의 구조는 다음과 같다 :

  • TestEAR
    • TestEJB
    • TestEJBClient
    • TestJPA
    • TestJSF

이제 클래스 정의가 없다는 오류를 수정 한 후에 내가 게시 한 경고와 관련된 또 다른 문제가있을 것이라고 생각합니다.

답변

3

EAR에서 EJB 모듈 (jar)에는 웹 모듈 (war)에 대한 가시성이 없습니다.EJB 모듈은 UI에 영향을 미치지 않으므로이 계층을 디커플링하는 것이 일반적입니다. 문제를 해결하려면 두 가지 옵션이 있습니다.

  1. 은 전쟁을하기 위해 응용 프로그램을 리팩토링 (전쟁이 또한 콩을 주입 할 수있을 것입니다) 하나 개의 EJB 모듈에서 EJB 주입해야하는 빈을 이동
  2. (예 당신은 EJB를 가질 수 있습니다 전쟁 중). EJB가 JBoss (원격 EJB도 마찬가지 임) 아래에서 작동합니다.
+0

클래스 정의 오류 (manifest)를 수정하지 않고 응용 프로그램을 테스트했는데 아무 문제없이 작동합니다. Application scope bean을 JSF .war에서 EJB 모듈에 삽입 할 수있는 것 같습니다. –

+1

JSF 모듈의 EJB 모듈에 종속성을 추가했습니다. 그것은 효과가 있지만 권장되는 방법은 아닙니다. –

관련 문제