2014-09-12 3 views
2

EJB 3.xJNDI Portable expose Classe d'implémentation

Tenir compte EJB suivant la mise en œuvre d'interface distante

@Remote 
public interface UnusualRemote { 
... 
} 

@Stateless 
public class UnusualBean implements UnusualRemote{ 
... 
} 

Le nom portable JNDI exposé à distance Interaface:

java:global/simplejee7/UnusualBean!com.example.UnusualRemote 

Ma question est pourquoi un client doit connaître la classe d'implémentation pour rechercher le bea n via jndi. Plus précisément, pourquoi on ne peut pas rechercher en utilisant seulement le nom de l'interface com.example.UnusualRemote

+1

Pour les haricots locaux, vous pouvez utiliser le gestionnaire de haricots CDI pour rechercher les haricots par leur interface. En utilisant un haricot Bridge, vous pouvez étendre cela pour les appels à distance. –

Répondre

1

Je pense que le point essentiel est qu'une interface distante peut être mis en œuvre par plusieurs EJB, si le client ne précise pas la mise en œuvre classe, le conteneur n'a aucun moyen d'identifier lequel choisir.

1

C'est en effet une chose stupide. Lorsque les noms portatifs ont été conçus quelqu'un dormait clairement. Le schéma de dénomination est conçu pour nommer une implémentation de bean particulière, mais il n'a pas pris en compte la fonction de recherche actuelle, qui est toujours par interface si le bean en implémente un.

Je ne suis pas d'accord avec la réponse de Gabriel. Bien sûr, il est possible de rechercher un bean par son interface. Le conteneur fait exactement cela lorsque vous injectez dans un champ qui a une interface en tant que son type.

Une autre chose à prendre en compte est que l'espace de noms "java:" revient souvent à la JVM locale et ne peut pas être utilisé pour les recherches à distance. Les recherches à distance sont très mal spécifiées, mais à cause de JAX-RS, personne ne veut plus le réparer.

+0

Je pense que Gabriel a raison. Nous ne pouvons pas déterminer l'instance de la classe d'implémentation réelle en utilisant uniquement l'interface. Il se peut que le conteneur EJB contienne deux instances d'objet ayant la même interface. Mais pour les différencier, nous devons connaître la classe d'implémentation réelle. – Hansraj

+0

@Hansraj pense à ce qui suit: supposons que ce que vous avez dit était vrai, comment le conteneur peut-il injecter une instance par interface alors? C'est à dire comment "@Inject private MyInterface mon;" où "MyInterface" est une interface qui fonctionne peut-être? –

-1

Voilà comment je pense/ce que je sais: -

En Java par exemple lorsque vous « mettre en œuvre/code à une interface » et quand vous « invoquez une méthode »; vous invoquez réellement sur l'objet qui est 'tapé' sur une interface; l'interface exposant une vue sur l'objet.

L'information la plus critique meta ici est l'identification de l'objet ou du 'reach' à l'objet et sa 'vue'; qui est précisément ce qui est stocké dans le service d'annuaire JNDI. (L'arborescence JNDI stocke essentiellement les proxys de l'objet bean qui peuvent être convertis au nom de l'interface.)

L'identification de l'objet ici est le nom JNDI que vous attribuez au bean (ou par défaut s'il n'est pas affecté) qui est un mandat sans lequel vous ne pouvez pas atteindre/identifier l'objet et la vue de l'objet est le nom de l'interface.

Espérons que les réponses. Pour ajouter à cela: -

Plus généralement la syntaxe pour déterminer le nom JNDI portable global de haricot est: - java:global[/<app-name>]/<module-name>/<bean-name>

Si aucun nom d'interface est spécifié, il signifie que le haricot met en œuvre une seule interface ou a un seul type/view et le nom de l'interface est donc facultatif.

Cependant, il peut y avoir des cas où un bean expose 'plusieurs vues client/implémente plusieurs interfaces'; auquel cas le nom JNDI portable ressemblerait à ceci: -

java:global[/<app-name>]/<module-name>/<bean-name>/<intf-name>

+0

merci pour la réponse, mais désolé ne sont pas d'accord, si vous devez connaître les détails de la mise en œuvre, quel est le point de l'interface – anergy

+0

peut-être vous confondre avec ou le "UnusualBean" dans votre message. Nous utilisons ce nom car aucun autre nom de bean n'est spécifié à l'aide d'une annotation. Par exemple '@EJB (name =" foobar ")' pourrait être utilisé et vous rechercheriez ce bean en utilisant "foobar" au lieu de votre "UnusualBean". En ce qui concerne le nom de votre interface Si votre bean implémente plusieurs interfaces, comment connaître la vue/l'interface à utiliser ou à utiliser sans la spécifier dans la recherche. – Abhin