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