2010-04-29 1 views
2

J'essaie d'accéder à un EJB3 à partir d'une application client Java EE, mais je continue d'obtenir uniquement des échecs de recherche. L'application client s'exécute dans le conteneur de client d'application Java EE.Échec de la recherche JNDI EJB3 dans le client d'application Java EE

Mon application Java Core 'CoreServer' expose un certain nombre de beans avec des interfaces distantes. Je n'ai aucun problème à y accéder depuis une application Web déployée sur le même Glassfish v3.0.1.

Maintenant, je suis en train d'y accéder à partir d'un client application:

public class Main { 

    public static void main(String[] args) { 
    CampaignControllerRemote bean = null; 

    try { 
     InitialContext ctx = new InitialContext(); 
     bean = (CampaignControllerRemote) ctx.lookup("java:global/CoreServer/CampaignController"); 

    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
    } 

    if (bean != null) { 
     Campaign campaign = bean.get(361); 
     if (campaign != null) { 
      System.out.println("Got "+ campaign); 
     } 
    } 
    } 

} 

Quand je lance le déployer sur GlassFish et l'exécuter à partir du appclient, je reçois cette erreur:

Lookup failed for 'java:global/CoreServer/CampaignController' in SerialContext targetHost=localhost,targetPort=3700,orb'sInitialHost=localhost,orb'sInitialPort=3700 

Cependant, c'est exactement le même nom JNDI que j'utilise lorsque je recherche le bean à partir de WebApplication (via SessionContext, pas InitialContext - est-ce important?). Aussi, quand je déploie 'CoreServer', Glassfish rapporte:

Portable JNDI names for EJB CampaignController : [java:global/CoreServer/CampaignController!mvs.api.CampaignControllerRemote, java:global/CoreServer/CampaignController] 
Glassfish-specific (Non-portable) JNDI names for EJB CampaignController : [mvs.api.CampaignControllerRemote, mvs.api.CampaignControllerRemote#mvs.api.CampaignControllerRemote] 

J'ai essayé tous les quatre noms, aucun travaillé. L'application est-elle incapable d'accéder aux beans avec (seulement) des interfaces distantes?

+0

Je recommande que vous passez à l'aide de l'injection de dépendance pour les cas d'utilisation ... (votre application web et application client). – vkraemer

+0

Comment la recherche CORBA est-elle effectuée avec l'injection de dépendances sur le client de l'application? Peux-tu être plus précis? – Thufir

Répondre

0

Si vous parlez d'un client autonome, utilisez cette réponse:

est ici la méthode que je l'utilise pour JNDI pour GlassFish v2, il peut être tout à fait similaire pour v3:

private void lookupJndi() { 
    final Properties props = new Properties(); 
    props.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.enterprise.naming.SerialInitContextFactory"); 
    String host = "hostname.domain"; 
    logger.log(Level.INFO, "Connecting to CORBA Host: " + host); 
    props.setProperty("org.omg.CORBA.ORBInitialHost", host); 
    try { 
     InitialContext ic = new InitialContext(props); 
     scheduleManager = (ScheduleManagerRemote) ic.lookup("ScheduleManagerRemote"); 
     experimentManager = (ExperimentManagerRemote) ic.lookup("ExperimentManager"); 
     facilityManager = (FacilityManagerRemote) ic.lookup("FacilityManager"); 
    } catch (NamingException e) { 
     ... 
    } 

La partie clé obtient le com.sun INITIAL_CONTEXT_FACTORY. Assurez-vous également que toutes les dépendances glassfish sont incluses dans votre application. Pour glassfish v2, il y en a beaucoup. Les fichiers v2 sont les suivants: javaee, appserv-rt, appserv-ext, appserv-admin, appserv-deployment-client.

Les choses peuvent être beaucoup plus simple avec v3, mais cela fonctionne certainement pour 2.x

+0

regroupe toutes les dépendances différentes de l'utilisation de 'appclient'? – Thufir

+1

@Thufir ça fait longtemps * que j'ai regardé ça, mais IIRC la différence avec l'appclient par rapport à un client autonome est que l'appclient est un conteneur géré, vos instances d'objet sont injectées. L'ensemble de dépendances associé si différent pour les deux cas d'utilisation. –

1

Si vous parlez d'un usage client demande cette réponse:

Ne vous embêtez pas avec JNDI recherche; vous pouvez utiliser l'injection @EJB dans les champs statiques de la classe d'application.

1

Avez-vous essayé java: global/CoreServer/CampaignController mvs.api.CampaignControllerRemote au lieu de java: global/CoreServer/CampaignController?