2016-11-25 2 views
1

Je suis plutôt novice à JBoss et les annotations. J'ai l'exemple de code suivant. Les détails non pertinents sont coupés.EJB Singleton service échoue au déploiement

@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; 
} 

Il est vrai que lorsque la guerre est sur JBoss déploie, il échoue à l'exception du producteur Repository (service dans une autre Jboss ne sont pas disponibles).

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

Ainsi se termine processus avec

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

Quelles sont les options dois-je? Puis-je dire à JBoss de ne pas @Inject beans au démarrage, mais quand le code est exécuté par timer? Puis-je attraper une exception? @Schedule est hors de question parce que j'ai besoin de configurer Timer.

Répondre

1

Les injections sont gérées par le CDI specification qui fournit une fonctionnalité permettant de "boucler" les injections, like so.

@Inject 
Instance<AnotherSingleton> anotherOneInstance; 

Cela crée essentiellement un proxy autour du AnotherSingleton et vous pouvez retarder l'obtention d'une référence réelle à elle au moment où vous en avez besoin.

AnotherSingleton anotherOne = anotherOneInstance.get(); 

Cela devrait permettre le déploiement de réussir et votre minuterie pour initialiser, mais bien sûr, si au moment où vous essayez d'utiliser anotherOne et le dépôt n'est pas disponible, le code sera toujours rompre avec une exception.

Alternativement, vous pouvez toujours faire un manual lookup through the BeanManager pour ne pas avoir à dépendre de toute forme d'injection de dépendance, mais cela devrait toujours être un dernier recours car il conduit juste à un code lourd.

+0

Merci pour l'indice. La solution avec Instance <> semble fonctionner correctement. – Eruanno

+0

@Eruanno Si cette réponse a résolu votre problème, veuillez l'accepter en cochant la case à côté de la réponse. –