2011-06-15 3 views
2

J'ai rencontré un problème que je n'arrive pas à résoudre. Je voudrais injecter un EJB dans un autre comme celui-ci:Java EE, injection d'un EJB dans un autre EJB

@Stateless 
public class MainEJB { 

    @EJB 
    private HelperEJB helper; 

} 

@Stateless 
public class HelperEJB implements HelperInterface { 

} 

Comme vous pouvez le voir, HelperEJB est exposée à travers une vue sans interface (note: HelperInterface est une interface d'une bibliothèque externe, il est pas un EJB interface). Cela ne fonctionne, et je vais l'exception suivante non:

javax.naming.NamingException: Lookup failed for 'org.mycompany.ejb.HelperEJB #org.mycompany.ejb.HelperEJB' 

Toutefois, si HelperEJB n'implémente aucune interface:

@Stateless 
public class HelperEJB { 

} 

Il fonctionnera. Il fonctionnera également si j'ai une interface @Local entre MainEJB et HelperEJB. Pourquoi cela ne peut-il être fait par une vue sans interface comme lors de ma première tentative?

Répondre

2

Votre premier exemple devrait fonctionner si votre domaine privé est déclaré en utilisant l'interface, comme ceci:

@Stateless 
public class MainEJB { 
    @EJB 
    private HelperInterface helper; // changed this 
} 

@Stateless 
public class HelperEJB implements HelperInterface { 
} 

@Local 
public interface HelperInterface { 
} 
+0

Merci, ça marche. Pourquoi est-ce si? Si un autre EJB est injecté via une vue sans interface, il * doit * être référencé par l'une de ses interfaces s'il en implémente? – Dario

+1

@Dario Comme l'a dit Arjan Tijms dans son article. – deltaforce2

2

Une vue sans interface est créé uniquement lorsque l'EJB n'implémente pas une interface (entreprise).

Vous pouvez déclarer explicitement que vous souhaitez une vue sans interface en utilisant l'annotation @LocalBean.