Tengo una clase como la siguiente:

public class Poligon {

    public static void main(String[] args) {

        try {
            Context ctx = new InitialContext();
            ConnectionFactory connectionFactory = (ConnectionFactory) ctx.lookup("jms/javaee7/ConnectionFactory");
            Destination destination = (Destination) ctx.lookup("jms/javaee7/Topic");
            JMSContext context = connectionFactory.createContext();
            OrderDTO order = context.createConsumer(destination).receiveBody(OrderDTO.class);
            System.out.println("Order received: " + order);
        } catch (NamingException ex) {
            Logger.getLogger(Poligon.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Me gustaría obtener la InitialContext() de forma que el servidor (glassfish) corriendo en localhost, pero me sale el siguiente error:

SEVERE: null
javax.naming.NoInitialContextException: Need to specify class name in environment or  system property, or as an applet parameter, or in an application resource file:  
    java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:344)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at poligon.Poligon.main(Poligon.java:29)

Sé que tengo que crear reino ldap en glassfish y agregue el siguiente código (? – no se conocen los valores exactos) para mi clase:

Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY,
            "?");
    env.put(Context.PROVIDER_URL, "?");
    env.put(Context.SECURITY_PRINCIPAL, "?");
    env.put(Context.SECURITY_CREDENTIALS, "?");

Context ctx = new InitialContext(env);

Mi problema es que no sé qué valores deben ser en:

Context.INITIAL_CONTEXT_FACTORY
Context.PROVIDER_URL (I want it on localhost)
Context.SECURITY_PRINCIPAL
Context.SECURITY_CREDENTIALS

Y no sé cómo debo configurar el servidor glassfish?

Cómo conseguir contexto inicial de GlassFish server en Java SE?

dependencias maven

    <dependency>
        <groupId>org.glassfish.main.extras</groupId>
        <artifactId>glassfish-embedded-all</artifactId>
        <version>4.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.main.appclient.client</groupId>
        <artifactId>gf-client</artifactId>
        <version>3.1.2.2</version>
    </dependency>
  • Revisión de la pregunta para mayor claridad
  • Podría usted decirme qué parte está claro?
  • Es la pregunta: «¿Cómo hacer disponibles los recursos ubicados en glassfish server en mi aplicación cliente?»?
  • a ver si esto ayuda, stackoverflow.com/questions/15779510/…
InformationsquelleAutor pshemek | 2014-07-19

2 Comentarios

  1. 1

    Con el fin de utilizar JNDI es necesario especificar el java.naming.factory.initial de alguna manera, como dice el mensaje de error.

    Hay varias maneras de hacer esto:

    Puede especificar como una propiedad del sistema en Glassfish, a través de server (Admin server) -> Properties

    Alternativamente, puede indicar en una tabla Hash y se pasan al constructor de InitialContext:

    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY,  
        "com.sun.enterprise.naming.SerialInitContextFactory");
    
    Context ctx = new InitialContext(env);

    Si utiliza la Primavera también se podría hacer esto:

    <bean id="myJndiTemplate" class="org.springframework.jndi.JndiTemplate">
        <property name="environment">
            <props>
                <prop key="java.naming.factory.initial">com.sun.enterprise.naming.SerialInitContextFactory</prop>
                <prop key="java.naming.factory.url.pkgs">com.sun.enterprise.naming</prop>
                <prop key="java.naming.factory.state">com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl</prop>
            </props>
        </property>
    </bean>

    Ver http://docs.oracle.com/javase/jndi/tutorial/beyond/env/context.html para obtener más información.

    Tan lejos como los valores reales de ir, la Primavera config anterior es lo que en realidad el uso con Glassfish. Softonic no especificar el proveedor de url o credenciales..

    No creo que esto es realmente conectado a la creación de un ldap-reino, Glassfish podría utilizar JNDI para buscar el reino, aunque.

    Edición:

    Creo que podría entender cuál es el problema, que usted está tratando de acceder de forma remota a clases de un cliente. Con este supuesto, puede utilizar la Primavera para ello, con JndiTemplate. Suponiendo que el servidor pone a disposición de la correcta EJB-clases, hacer esto en el lado del cliente:

    Crear un bean para JndiTemplate:

      <bean id="myJndiTemplate" class="org.springframework.jndi.JndiTemplate">
        <property name="environment">
          <props>
            <prop key="java.naming.factory.initial">com.sun.enterprise.naming.SerialInitContextFactory</prop>
            <prop key="org.omg.CORBA.ORBInitialHost">${servername}</prop>
            <prop key="org.omg.CORBA.ORBInitialPort">${jndiport}</prop>
          </props>
        </property>
      </bean>

    Usted puede entonces utilizar este grano a la búsqueda de cosas en el servidor. Si desea dar un paso más, y llamar a su propio remoto EJB-clases, también se podría hacer esto:

      <bean id="ejbProxy"
            class="org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean"
            abstract="true">
        <property name="refreshHomeOnConnectFailure" value="true"/>
        <property name="cacheHome" value="true"/>
        <property name="lookupHomeOnStartup" value="true"/>
        <property name="resourceRef" value="false"/>
        <property name="jndiTemplate" ref="mySpringTemplate"/>
      </bean>

    Y, a continuación, definir los frijoles como:

      <bean id="someRemoteService" parent="ejbProxy">
        <property name="jndiName"
                  value="com.company.service.MyRemoteService"/>
        <property name="businessInterface"
                  value="com.company.service.MyRemoteService"/>
      </bean>

    Puede inyectar esta como una de frijol, las llamadas a la misma se realiza en el servidor.

    • He utilizado el hashTable solución, pero tengo un error: javax.nomenclatura.NoInitialContextException: No se puede crear una instancia de la clase: com.sol.empresa.nomenclatura.SerialInitContextFactory [Root excepción java.lang.ClassNotFoundException: com.sol.empresa.nomenclatura.SerialInitContextFactory]
    • Hmm que la clase debe ser incluido con Glassfish. Se está ejecutando esta en glassfish?
    • No es independiente de la aplicación.
    • Entonces usted necesita para agregar algunos frascos a la ruta de clases, glassfish-embedded-todos tiene la clase, con un pom dependencia a org.glassfish.principal.appclient.cliente:gf-cliente (tiene un transitiva dep para glassfish-nomenclatura que contiene la clase) también debe hacer el truco. Consulte stackoverflow.com/questions/12002948/…
    • he actualizado mi repositorio de maven y ahora dice: no se Pudo resolver dependencias para el proyecto de com.miempresa:JMS:jar:1.0-SNAPSHOT: Los siguientes artefactos no se pudo resolver: org.eclipse.persistencia:javax.persistencia:jar:2.0.4.v201112200901, org.eclipse.persistencia:org.eclipse.la persistencia.núcleo:jar:2.3.2, org.eclipse.persistencia:org.eclipse.la persistencia.jpa:jar:2.3.2, org.eclipse.persistencia:org.eclipse.la persistencia.jpa.modelgen:jar:2.3…
    • Algo que ver con el control remoto de los repositorios de maven, supongo. Asegúrese de que tiene la correcta repositorios remotos configurar.
    • En su main() método de crear instancias de un InitialContext y llamar a varios Glassfish métodos sin alguna partida de Glassfish. Consulte glassfish.java.net/docs/4.0/embedded-server-guide.pdf para obtener información sobre cómo configurar el proyecto y empezar a Glassfish.
    • No creo que una incrustado glassfish es lo que el op quiere, pero la pregunta no es muy clara, así que no puede estar seguro..

  2. 1

    Para acceder a glassfish (y también buscar el BEI), corriendo en localhost, he tenido que utilizar:

    public class Main {
    
        public static void main(String[] args) throws NamingException {
    
            java.util.Hashtable<String, String> hashTable = new Hashtable<String, String>();
            hashTable.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.impl.SerialInitContextFactory");
            hashTable.put(Context.STATE_FACTORIES, "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
            hashTable.put(Context.URL_PKG_PREFIXES, "com.sun.enterprise.naming");
            Context ctx = new InitialContext(hashTable);
    
        //Looks up the EJB with JNDI
            BookEJBRemote bookEJB = (BookEJBRemote) ctx.lookup("java:global/chapter08-service-1.0/BookEJB!org.agoncal.book.javaee7.chapter08.BookEJBRemote");
        }
    }

    Cuando glassfish está corriendo en localhost, el Contexto puede ser iniciado con propiedades predeterminadas (sin hashtable parámetro)

    Context ctx = new InitialContext();

Dejar respuesta

Please enter your comment!
Please enter your name here