Cliente Swing + EJB + Glassfish [RESOLVIDO]

Olá pessoal,

Depois de algumas semanas estudando e pesquisando sobre EJB e sobre o Glassfish, consegui fazer uns testes básicos.

Agora estou tendo alguns problemas aqui.
Criei um módulo EJB no NetBeans 7 e depois o modulo cliente em Swing. Eu não criei um cliente de aplicativo empresarial como tem a opção no IDE na categoria JavaEE. Criei apenas um aplicativo JavaSE normal.

No NetBeans tudo funciona perfeitamente. O modulo EJB está implantado no glassfish na minha máquina local. Porém quando rodo o cliente fora do netbeans dá um erro que está na imagem em anexo.

Alguém sabe porque esse erro acontece se eu quiser rodar fora do IDE? Estou fazendo corretamente?

Outra coisa é, como faço pra conectar a app em Swing a um server glassfish remoto?

Valeu.



Jovem,

Pelo erro está faltando o jndi properties ou as configurações do mesmo não estão corretas.

Abs,

Olá Kanin,

Então… no Netbeans ele funciona normalmente, depois que gero o .jar é que dá o problema.

Mas aqui estou fazendo assim somente.

        try {
            InitialContext ctx = new InitialContext();
            HelloBeanRemote remote = (HelloBeanRemote) ctx.lookup("java:global/Optimus-ejb/HelloBean");
            
            int id = Integer.valueOf(JOptionPane.showInputDialog(this, "Informe o id"));
            txtMensagem.setText(remote.sayHello(id));
        } catch (Exception e) {
            e.printStackTrace();
        }

Você poderia mostrar como configurar corretamente?

Qual é a exception?

Está na imagem do prompt acima.

Lembrando que só acontece erro se eu rodar a app Swing fora do Netbeans!

Suas propriedades do JNDI não estão devidamente configuradas. Veja um exemplo no Jboss

Properties props = new Properties(); props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); props.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming.client"); props.setProperty(Context.PROVIDER_URL, "jnp://127.0.0.1:1099"); props.setProperty("j2ee.clientName", "contato-client"); try { return new InitialContext(props); } catch (NamingException e) { e.printStackTrace(); return null; }
Eu não posso te ajudar pq não uso Glassfish.

[quote=FernandoFranzini]Suas propriedades do JNDI não estão devidamente configuradas. Veja um exemplo no Jboss

Properties props = new Properties(); props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); props.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming.client"); props.setProperty(Context.PROVIDER_URL, "jnp://127.0.0.1:1099"); props.setProperty("j2ee.clientName", "contato-client"); try { return new InitialContext(props); } catch (NamingException e) { e.printStackTrace(); return null; }
Eu não posso te ajudar pq não uso Glassfish.
[/quote]

Pois é… procurei várias vezes no google sobre essas configurações no Glassfish 3.1 e não encontrei… somente a que está acima que inclusive retirei o site do Glassfish.

Esses dois links podem te ajudar:
http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB
http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#nonJavaEEwebcontainerRemoteEJB

Olá André!

Segui as recomendações mas sinceramente não sei onde está o erro.

[code] public static void main(String[] args) {
// TODO code application logic here
try {
Properties props = new Properties();
props.setProperty(“java.naming.factory.initial”,“com.sun.enterprise.naming.SerialInitContextFactory”);
props.setProperty(“java.naming.factory.url.pkgs”,“com.sun.enterprise.naming”);
props.setProperty(“java.naming.factory.state”,“com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl”);
// optional. Defaults to localhost. Only needed if web server is running
// on a different host than the appserver
props.setProperty(“org.omg.CORBA.ORBInitialHost”, “localhost”);
// optional. Defaults to 3700. Only needed if target orb port is not 3700.
props.setProperty(“org.omg.CORBA.ORBInitialPort”, “3700”);

        InitialContext ctx = new InitialContext(props);
        UsuariosBeanRemote remote = (UsuariosBeanRemote) ctx.lookup("ejbs.UsuariosBean");
        System.out.println(remote.getUser(1));
        
    } catch (Exception e) {
        e.printStackTrace();
    }        
}[/code]

Esse é o código que to usando segundo o exemplo dos links que você me passou.

Será que falta alguma coisa a fazer no Glassfish? Eu apenas implantei o modulo EJB.
Com os arqumentos java:global/OptimusEJB/UsuariosBean funciona de boa, mas só dentro do netbeans!!!

Esse é o stack do erro:

08/06/2011 10:10:26 com.sun.enterprise.v3.server.CommonClassLoaderServiceImpl findDerbyClient INFO: Cannot find javadb client jar file, derby jdbc driver will not be available by default. javax.naming.NamingException: Lookup failed for 'ejbs.UsuariosBean' in SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=3700, java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory, org.omg.CORBA.ORBInitialHost=localhost, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: ejbs.UsuariosBean not found] at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) at javax.naming.InitialContext.lookup(InitialContext.java:392) at optimusclient.OptimusClient.main(OptimusClient.java:34) Caused by: javax.naming.NameNotFoundException: ejbs.UsuariosBean not found at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:248) at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:215) at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:77) at com.sun.enterprise.naming.impl.RemoteSerialContextProviderImpl.lookup(RemoteSerialContextProviderImpl.java:94) at sun.reflect.GeneratedMethodAccessor516.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(ReflectiveTie.java:144) at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:174) at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:528) at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:199) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1624) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1486) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:990) at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:214) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:742) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:539) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2324) at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497) at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540)

Ops… consegui… só agora ví que o endereço indicado é da interface remota e não do EJB!

Vamos ver se vai rodar com o java -jar de fora do IDE!

Continua com o mesmo erro quando rodo fora do IDE.

Stack do erro:

javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory] at javax.naming.spi.NamingManager.getInitialContext(Unknown Source) at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source) at javax.naming.InitialContext.init(Unknown Source) at javax.naming.InitialContext.<init>(Unknown Source) at optimusclient.OptimusClient.main(OptimusClient.java:33) Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at com.sun.naming.internal.VersionHelper12.loadClass(Unknown Source) ... 5 more

Agora falta jar no seu classpath do cliente (provavelmente). Se no NetBeans funciona, é algum jar que está faltando você colocar junto com o jar do seu cliente (e configurar o classpath desse cliente).

Pois é, de acordo com o stack parece ser isso mesmo… estou dando uma pesquisada aqui…
de acordo com os links que você me passou, preciso apenas do gf-client.jar, porém não está dando certo!

Pelo jeito o problema está na falta da biblioteca appserv-rt.jarque se não me engano o site do glassfish diz que é desnecessário na versão 3.1! baixei essa lib appserv-rt e agora dá outro erro que parece que falta uma classe nessa mesma biblioteca. Vai ver é a versão… estou tentando achar uma que dê certo!

O stack do novo erro é:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/logging/LogDomains at com.sun.enterprise.util.ORBManager.<clinit>(ORBManager.java:78) at com.sun.enterprise.naming.SerialInitContextFactory.<clinit>(SerialInitContextFactory.java:56) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at com.sun.naming.internal.VersionHelper12.loadClass(Unknown Source) at javax.naming.spi.NamingManager.getInitialContext(Unknown Source) at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source) at javax.naming.InitialContext.init(Unknown Source) at javax.naming.InitialContext.<init>(Unknown Source) at optimusclient.OptimusClient.main(OptimusClient.java:35) Caused by: java.lang.ClassNotFoundException: com.sun.logging.LogDomains at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 10 more

Bom, até agora só dor de cabeça… alguém aí usa o glassfish 3.1?

Adicionei as libs necessárias e até agora nada

Segue o stack:

javax.naming.CommunicationException: Can't find SerialContextProvider [Root exception is java.lang.ClassCastException] at com.sun.enterprise.naming.SerialContext.getProvider(SerialContext.java:135) at com.sun.enterprise.naming.SerialContext.lookup(SerialContext.java:288) at javax.naming.InitialContext.lookup(Unknown Source) at optimusclient.OptimusClient.main(OptimusClient.java:39) Caused by: java.lang.ClassCastException at com.sun.corba.ee.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:229) at javax.rmi.PortableRemoteObject.narrow(Unknown Source) at com.sun.enterprise.naming.SerialContext.narrowProvider(SerialContext.java:93) at com.sun.enterprise.naming.SerialContext.getProvider(SerialContext.java:128) ... 3 more Caused by: java.lang.ClassCastException: Object is not of remote type com.sun.enterprise.naming.SerialContextProvider at com.sun.corba.ee.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:221) ... 6 more

Resolvido… copiei a pasta modules e a lib gf-client.jar para a pasta lib da aplicação e rodou de boa… depois vou verificar quais são realmente as libs necessárias!
Muito obrigado a todos…

Este link me ajudou bastante: http://groups.google.com/group/jug-ms/browse_thread/thread/dc6b63a189a9af7f/979f007fbaed43af?lnk=raot

Vc descobriu quais são as libs necessarias?
Estou tendo esse mesmo problema, mas pra rodar fora do eclipse. De qquer forma a classe que não esta encontrando é a mesma.

[quote=maul]Vc descobriu quais são as libs necessarias?
Estou tendo esse mesmo problema, mas pra rodar fora do eclipse. De qquer forma a classe que não esta encontrando é a mesma.[/quote]

Sim. Daqui a pouco passo a lista.

Seque a lista na imagem em anexo.

Todos os jars podem ser encontrados dentro da pasta de instalação do glassfish. Se tiver dúvidas poste aqui.


Libs Necessárias : appserv-rt-jar
gf-client.jar
imqjmsra.jar <-- a q eh mais tensa de achar!
javaee.jar
javahelp.jar
jndi-properties.jar