2016-11-25 9 views
1

저는 JBoss와 주석에 초보자입니다. 다음 코드 예제가 있습니다. 관련없는 세부 정보는 삭제됩니다.EJB Singleton 서비스가 배포시 실패합니다.

@Singleton 
@Startup 
public class SomeBean { 

    @Resource 
    TimerService timerService; 

    @Inject 
    AnotherSingleton anotherOne; 

    Timer timer; 

    @PostConstruct 
    private void ejbCreate() { 
     timer = timerService.createIntervalTimer(0, interval, tc); 
    } 

    @Timeout 
    public void run() throws Exception { 
    } 
} 

@Singleton 
public class AnotherSingleton { 

    @Inject 
    Repository rep; 
} 

전쟁이 JBoss에 배포되는 경우 Repository 생성자 (다른 Jboss의 서비스를 사용할 수 없음)에서 예외가 발생하는 경우가 있습니다.

Caused by: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance 

그래서 과정은

WFLYCTL0186: Services which failed to start:  service jboss.deployment.unit."someservices-view.war".component.SomeBean.START 

내가 어떤 옵션이 있습니까로 끝? 시작시 @Inject Bean을하지 않고 타이머로 코드를 실행하도록 JBoss에 알릴 수 있습니까? 나는 어떻게 든 예외를 잡을 수 있습니까? Timer를 구성해야하기 때문에 @Schedule이 유용하지 않습니다.

답변

1

주사는 like so과 같이 주사를 "감싸는"기능을 제공하는 CDI specification으로 처리됩니다.

@Inject 
Instance<AnotherSingleton> anotherOneInstance; 

기본적으로 AnotherSingleton 주위에 프록시가 만들어지며 필요할 때 실제 참조를 가져 오는 것을 지연시킬 수 있습니다.

AnotherSingleton anotherOne = anotherOneInstance.get(); 

이 순간에 당신이 anotherOne을 사용하려고하고 저장소 코드는 여전히 예외가 중단됩니다, 사용할 수없는 경우,하지만 물론 초기화에 성공 배포하고 타이머를 허용해야합니다.

또는 항상 manual lookup through the BeanManager을 수행하면 어떤 형태의 의존성 주입에도 의존하지 않아도되지만, 성가신 코드로 이어지는 최후의 수단이어야합니다.

+0

힌트를 보내 주셔서 감사합니다. Instance <>가있는 솔루션은 정상적으로 작동하는 것 같습니다. – Eruanno

+0

@ Eruanno이 답변으로 문제가 해결 된 경우 대답 옆에있는 체크 표시를 선택하여 동의하십시오. –