Búsqueda de cliente EJB3

Estoy tratando de invocar un EJB desde un cliente Java independiente y obtengo el siguiente error.

Código de búsqueda

String localJNDIName = "ejbremote:gcmsnew/gcmsutilbeans.jar/CustomerSurveyManageQstBean#com.smbcgroup.gcms.utility.bl.survey.CustomerSurveyManageQstRemote";
InitialContext ic = new InitialContext();
GCMSBaseRemote bean = (GCMSBaseRemote)ic.lookup(localJNDIName);

Excepción

javax.naming.ConfigurationException: NamingManager.getURLContext no puede encontrar la fábrica para este esquema: ejbremote en com.ibm.ws.naming.jndicos.CNContextImpl.checkForUrlContext (CNContextImpl.java:471) en com.ibm.ws.naming.util. WsnInitCtx.lookup (WsnInitCtx.java:160) en com.ibm.ws.naming.util.WsnInitCtx.lookup (WsnInitCtx.java:179) en javax.naming.InitialContext.lookup (fuente desconocida) en com.test.est. principal (EJBClientTest.java:18)

Medio Ambiente

RAD 7.5, EJB3. Websphere Application Server 7.0.

preguntado el 01 de diciembre de 11 a las 13:12

4 Respuestas

El esquema ejbremote no existe en WebSphere Application Server (aunque "ejblocal" sí existe). Intente usar un ejb / prefijo en lugar de ejbremote:.

Para obtener más información, consulte la sección de Descripción general de los enlaces de la aplicación EJB tema en el InfoCenter.

Respondido el 05 de diciembre de 11 a las 19:12

Funcionó como una magia. ¿Puede dar algunos consejos a alguna lectura de referencia para comprender más sobre esto? - Rafi

Agregué un enlace de InfoCenter, pero avíseme si tiene otras preguntas. - Brett Kail

@BrettKail, el enlace parece estar roto. - Govinda Sakhare

Parece que IBM rompió el vínculo. Ya no estoy lo suficientemente familiarizado con el producto como para encontrar un reemplazo. Perdón. - Brett Kail

Dado que este es un cliente independiente ("delgado"), debería intentar algo como esto:

   Properties properties = new Properties();
   properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");
   properties.setProperty(Context.PROVIDER_URL,"corbaloc:iiop:localhost:2809"); //localhost=the host where your EJB is located, 2809=BOOTSTRAP_ADDRESS port
   Context initCtx = new InitialContext(properties);
   Object homeObject = initCtx.lookup("com.smbcgroup.gcms.utility.bl.survey.CustomerSurveyManageQstRemote"); //by default the JNDI name of your Remote Interface is its full class name
   // Narrow to a real object
   csmo = (CustomerSurveyManageQstRemote) javax.rmi.PortableRemoteObject.narrow(homeObject, com.smbcgroup.gcms.utility.bl.survey.CustomerSurveyManageQstRemote.class);

También debe tener los archivos Websphere Jars adecuados en su classpath para realizar las llamadas anteriores.

respondido 22 nov., 12:13

He usado otros nombres como, java: global, ejblocal, esos no funcionaron y dieron algunos errores extraños. Esto funcionó para mí .initCtx.lookup ("com.smbcgroup.gcms.utility.bl.survey.CustomerSurveyManageQstRemote"); // por defecto el nombre JNDI de su interfaz remota - Vh24

Para búsqueda remota

import java.io.IOException;
import java.util.Hashtable;  
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class ServiceLocator {
    static String url = "corbaloc:iiop:localhost:2809";
    static String initial = "com.ibm.websphere.naming.WsnInitialContextFactory";  
    static String jndi = "ejb/enterprise_app_name/ejb_web_project_name.jar/ejb_name#name.of.remote.impl.interface";


    private static ServiceLocator serviceLocator = null;  

    InitialContext context = null;

    private ServiceLocator() throws NamingException, IOException { 

        Hashtable<String,String> env = new Hashtable<String,String> (); 
        env.put("java.naming.provider.url",  url ); 
        env.put("java.naming.factory.initial",  initial );
        context = new InitialContext(env);
    }

    public synchronized static ServiceLocator getInstance() throws NamingException, IOException {

        if (serviceLocator == null) {
            serviceLocator = new ServiceLocator(); 
        }

        return serviceLocator;
    }  

    public Object getService(String jndiName) throws NamingException {
        return context.lookup(jndiName); 
    }

    public <T>T getRemoteObject(Class<T> remoteInterfaceClass) {
        try {

            return (T)javax.rmi.PortableRemoteObject.narrow( context.lookup(jndi), remoteInterfaceClass);

        } catch (NamingException nexc) {

            nexc.printStackTrace(); 

        }
        return null;
    }

}

Para búsqueda local

import java.io.IOException;
import java.util.Hashtable;  
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class ServiceLocator {
    static String url = "iiop://localhost";
    static String initial = "com.ibm.websphere.naming.WsnInitialContextFactory";  
    static String jndi = "ejblocal:enterprise_app_name/ejb_web_project_name.jar/ejb_name#name.of.local.impl.interface";



    private static ServiceLocator serviceLocator = null;  

    InitialContext context = null;

    private ServiceLocator() throws NamingException, IOException { 

        Hashtable<String,String> env = new Hashtable<String,String> (); 
        env.put("java.naming.provider.url",  url ); 
        env.put("java.naming.factory.initial",  initial );
        context = new InitialContext(env);
    }

    public synchronized static ServiceLocator getInstance() throws NamingException, IOException {

        if (serviceLocator == null) {
            serviceLocator = new ServiceLocator(); 
        }

        return serviceLocator;
    }  

    public Object getService(String jndiName) throws NamingException {
        return context.lookup(jndiName); 
    }

    public Object getService() throws NamingException {
        return context.lookup(jndi); 
    }

}

Respondido el 05 de junio de 13 a las 13:06

Necesita tener el archivo stub para invocar el EJB, así que primero genere el archivo stub. En websphere hay una utilidad disponible en la carpeta bin del servidor de aplicaciones createEJBStubs.

Respondido el 02 de diciembre de 11 a las 15:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.