2012-01-27 14 views
11

Ecco la situazione.WELD-001408 Dipendenze insoddisfatte quando si iniettano EJB che implementano interfacce

ho le seguenti interfacce:

public interface Parent { } 
public interface ChildOne extends Parent { } 
public interface ChildTwo extends Parent { } 

e 2 EJB:

@Stateless 
public class FirstBean implements ChildOne { } 

@Stateless 
public class SecondBean implements ChildTwo { } 

E anche questo CDI Bean:

@Named 
@SessionScoped 
public class TestController implements Serializable { 

    @Inject 
    private FirstBean firstBean; 

    @Inject 
    private SecondBean secondBean; 
} 

durante il tentativo di distribuire questo su Glassfish 3.1 ottengo la seguente eccezione:

Exception while loading the app : WELD-001408 Unsatisfied dependencies for type [FirstBean] 
with qualifiers [@Default] at injection point [[field] @Inject private com.test.controllers.TestController.firstBean] 
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [FirstBean] 
with qualifiers [@Default] at injection point [[field] @Inject private com.test.controllers.TestController.firstBean] 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:305) 

Quando entrambi gli EJB implementano l'interfaccia Parent, l'eccezione è la stessa.
Inoltre, ho provato ad aggiungere qualificatori, ma questo non ha cambiato nulla.

risposta

20

Ho appena giocato in giro con il costrutto, leggere un po 'della saldatura docu e scoperto quanto segue.

Si stanno utilizzando EJB che implementano un'interfaccia, quindi la vista senza interfaccia non è più possibile (ovviamente), ma si sta tentando di accedere direttamente all'implementazione. Non appena lo dichiari come un EJB devi tenere a mente le convenzioni. Quindi, se si definisce un'interfaccia, è necessario utilizzarla per ottenere l'accesso all'EJB. Cambiandolo in seguito, dovrebbe funzionare out:

@Inject 
private ChildOne firstBean; 

Accesso alla realizzazione anche se un'interfaccia è definito è solo possibile per strisciamento fagioli CDI gestiti (classi sul @ Stateless/@ annotazioni stateful). Quindi sbarazzarsi della tua annotazione e funzionerà.

Solo per vostra informazione, se state usando Glassfish. Se vi attenete ai vostri EJB e provate ad accedere al metodo delle interfacce genitore, vi imbatterete nel bug/eccezione this.

+0

Grazie mille! Davvero una buona spiegazione! E mi sono già imbattuto in quell'eccezione "Impossibile convertire ejbRef per ejb ...", semplicemente non sapevo che fosse un problema noto. – jFrenetic

+0

L'ho controllato ancora una volta. Ho provato a iniettare quei bean per riferimento all'interfaccia come suggerivi.E sto ancora ricevendo questa eccezione "Dipendenze insoddisfatte ..." durante l'implementazione. Ho persino annotato le interfacce con @Local. Ancora non funziona. – jFrenetic

+0

L'ho provato ieri e ha funzionato per me, inoltre ha molto senso. Ad ogni modo, lo riproverò di nuovo quando torno a casa. –

0

Hai provato a utilizzare l'annotazione @EJB piuttosto che l'annotazione CDI @inject?

E.g.

@Named 
@SessionScoped 
public class TestController implements Serializable { 

    @EJB 
    private FirstBean firstBean; 

    @EJB 
    private SecondBean secondBean; 
} 
+0

No, non l'ho fatto. Grazie per l'idea, ma voglio davvero capire cosa sto facendo male qui. – jFrenetic

+0

Hai un bean.xml nel tuo META-INF? –

+0

Lo so. Se non l'avessi, il WELD non avrebbe rilevato i miei bean CDI e non avrebbe eseguito la convalida durante la distribuzione. – jFrenetic

6

Meglio tardi che mai:

Annotare la SLSB Aditionally con @LocalBean lavori per me con JBoss AS 7.1.1. Non mi piace l'idea di creare l'interfaccia senza alcun valore aggiunto.

Usando il tuo esempio:

@Stateless 
@LocalBean 
public class FirstBean implements ChildOne { } 

@Stateless 
@LocalBean 
public class SecondBean implements ChildTwo { } 
+0

@atamanroman , sai se quel metodo è portatile? Perché la definizione per '@ LocalBean' è" Designa che un bean ** session ** espone una vista senza interfaccia "e dato che non è un bean" session "qui, funzionerà ovunque ed è la cosa giusta da fare? –

+1

@AnthonyO. i bean di sessione stateless e i bean di sessione stateful sono entrambi bean di sessione. Quindi sì, questo è esattamente come richiede lo standard. – atamanroman

+0

Funziona anche per JBoss 6.1.0 – Ste

Problemi correlati