Question

Disons que j'ai les EJB suivants (en utilisant ejb3):

@Stateless(name="Queries")
@Remote(Queries.class)
@Local(Queries.class)
public final class QueriesEJB implements Queries {
    ...
}

La classe est disponible via une interface locale et une interface distante.

Comment puis-je injecter l'interface locale de cet EJB dans une autre partie de l'application?

En particulier, je ne sais pas comment créer une annotation @EJB qui sélectionne l'interface locale . Par exemple, est-ce que ce qui suit est suffisant?

@EJB(name="Queries") private Queries queries;

En particulier, je souhaite éviter de créer des interfaces locales et distantes distinctes uniquement dans le but de distinguer via la propriété 'beanInterface' de @ EJB.

Était-ce utile?

La solution

Selon les spécifications, vous ne pouvez pas avoir une interface à la fois distante et locale. Cependant, vous créez une super-interface, y mettez toutes les méthodes, puis vous créez 2 sous-interfaces. Ceci fait, utilisez simplement @EJB. De cette façon, vous ne devez gérer qu’une seule interface.

EDIT: voir la section 3.2 de la section "Spécifications simplifiées EJB3". sur http://jcp.org/aboutJava/communityprocess/final/jsr220/index .html

Autres conseils

Lorsqu'un EJB est déployé, le conteneur examine les interfaces et identifie les interfaces locales et distantes. Je dirais que le conteneur EJB utilise déjà l'interface locale dans votre exemple. Dans ce cas, il n’est tout simplement pas nécessaire d’utiliser une interface distante, car le conteneur a le choix d’utiliser une interface locale.

Si vous voulez être sûr d'essayer d'utiliser le nom JNDI de l'interface locale comme paramètre de l'annotation @EJB.

@EJB(name="java:comp/env/ejb/EntitySupplierLocal")

Dans l'exemple ci-dessus, j'ai ajouté local au nom de l'interface. Dans votre cas, vous devez examiner le contexte JNDI pour obtenir le bon nom ou même le connaître;).

En règle générale, il est recommandé d'utiliser une interface de base définissant les méthodes métier et d'étendre les interfaces locale et distante. Ainsi, vous n'avez pas à dupliquer les méthodes et vous pouvez étendre les fonctionnalités pour l'accès local et distant séparément.

public interface Queries () { .. }

@Local
public interface QueriesLocal extends Queries () { .. }

@Remote
public interface QueriesRemote extends Queries () { .. }

Les solutions des commentaires précédents ne sont pas entièrement compatibles avec EJB 3.0 sur Jboss.

Vous pouvez facilement obtenir cette erreur:

org.jboss.ejb3.common.resolvers.spi.NonDeterministicInterfaceException:
beanInterface specified, Queries, is not unique within EJB QueriesEJB

Créez uniquement ceci:

public interface Queries ()  //Local by default

@Remote
public interface QueriesRemote extends Queries () { ... }

Ça marche

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top