Como obter o contexto inicial do servidor GlassFish no Java SE?

Eu tenho uma aula como abaixo:

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); } } } 

Eu gostaria de obter o InitialContext () do servidor (glassfish) em execução no host local, mas recebo o erro abaixo:

 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) 

Eu sei que tenho que criar o reino ldap no glassfish e adicionar o código abaixo (? – não sei os valores exatos) para minha class:

 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); 

Meu problema é que eu não sei em que valores devo estar:

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

E eu não sei como devo configurar o servidor glassfish?

insira a descrição da imagem aqui

dependencies maven

   org.glassfish.main.extras glassfish-embedded-all 4.0 provided   org.glassfish.main.appclient.client gf-client 3.1.2.2  

Para usar o JNDI, você precisa especificar o java.naming.factory.initial alguma forma, exatamente como a mensagem de erro diz.

Existem várias maneiras de fazer isso:

Você poderia especificá-lo como uma propriedade do sistema no Glassfish, através do server (Admin server) -> Properties

Alternativamente, você poderia especificá-lo em um HashTable e passá-lo para o construtor de InitialContext :

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

Se você usa o Spring, você também pode fazer isso:

    com.sun.enterprise.naming.SerialInitContextFactory com.sun.enterprise.naming com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl    

Veja http://docs.oracle.com/javase/jndi/tutorial/beyond/env/context.html para mais informações.

Quanto aos valores reais, a configuração de Spring acima é o que realmente usamos com o Glassfish . Nós não especificamos URL ou credenciais do provedor.

Eu não acho que isso esteja realmente ligado à criação de um ldap-realm, mas a Glassfish pode usar o JNDI para procurar o reino.

Editar:

Eu acho que eu poderia entender qual é o problema, você está tentando acessar classs remotas de um cliente. Com essa suposição, você pode usar o Spring para fazer isso, com o JndiTemplate. Supondo que o servidor disponibilize as classs EJB corretas, faça isso no lado do cliente:

Crie um bean para o JndiTemplate:

     com.sun.enterprise.naming.SerialInitContextFactory ${servername} ${jndiport}    

Você pode então usar esse bean para pesquisar coisas no servidor. Se você quiser dar um passo adiante, e chamar suas próprias classs EJB remotas, você também pode fazer isto:

         

Em seguida, defina beans como:

      

Você pode injetar isso como um bean regular, todas as chamadas para ele serão feitas para o servidor.

Para acessar o glassfish (e também procurar o EIB) rodando em localhost eu tive que usar:

 public class Main { public static void main(String[] args) throws NamingException { java.util.Hashtable hashTable = new Hashtable(); 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"); } } 

Quando o glassfish está sendo executado no host local, o Context pode ser iniciado com propriedades padrão (sem o parâmetro hashtable)

 Context ctx = new InitialContext();