Parte 4
Criando um Client para o nosso Stateless SessionBean
Agora, com o nosso componente rodando no servidor, precisamos testa-lo e acessa-lo.? Vamos agora escrever um cliente que possa acessar o componente e seus métodos de negócio.? O nosso cliente precisará conectar-se ao serviço de nomes (JNDI) e encontrar o nosso componente.
Para usarmos uma abordagem mais de acordo com o que acontece no mundo real durante o desenvolviemnto de um sistema, vamos criar um “ServiceLocator”.
ServiceLocator é uma pattern que nos poupa o trabalho de pegar o InitialContext toda vez que quisermos uma interface para um objeto de negócio.? Imagine que toda vez que você for acessar um componente EJB você faça assim:
try {
Hashtable t = new Hashtable();
t.put(Context.INITIAL_CONTEXT_FACTORY,? ? ? ? "org.jnp.interfaces.NamingContextFactory");
t.put(Context.PROVIDER_URL, "localhost");
t.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
initialContext = new InitialContext(t);
UsuarioService usuarioService = (UsuarioService) initialContext.lookup(UsuarioService.class.getName());
} catch (Exception exc) {
exc.printStackTrace();
}
}
É evidente que isso faria o nosso código ficar demasiadamente grande.? Por isso concentramos o processo de “procurar” o objeto no serviço de nomes em um Singleton, que fará esse trabalho para nós.
Crie uma classe chamada “ServiceLocator, dentro do pacote “com.service”.? Aqui o nosso ServiceLocator:
package com.service;
import java.util.HashMap;
import java.util.Hashtable;
import javax.ejb.EJBHome;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class ServiceLocator {
private HashMap homes = new HashMap();
private static ServiceLocator locator;
private InitialContext initialContext;
private ServiceLocator() {
try {
Hashtable t = new Hashtable();
t.put(Context.INITIAL_CONTEXT_FACTORY,? ? ? ? "org.jnp.interfaces.NamingContextFactory");
t.put(Context.PROVIDER_URL, "localhost");
t.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
initialContext = new InitialContext(t);
} catch (Exception exc) {
exc.printStackTrace();
}
}
public static ServiceLocator getInstance() {
if (locator == null) {
locator = new ServiceLocator();
}
return locator;
}
protected Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException(
"Nao e possivel clonar o ServiceLocator!");
}
public Object get(String jndiName) throws Exception {
try {
Object result = null;
result = initialContext.lookup(jndiName);
if(result==null) {
if (result==null) {
throw new NamingException();
}
}
return result;
} catch (NamingException e) {
e.printStackTrace();
}
return null;
}
}
Agora vamos criar uma classe teste, para acessar o nosso objeto, crie um pacote chamado “com.testes” e nele uma classe chamada “TestUsuario”:
package com.testes;
import com.service.ServiceLocator;
import com.service.UsuarioService;
public class TestUsuario {
public static void main (String...args){
try{
UsuarioService usuario = (UsuarioService)ServiceLocator.getInstance().get(UsuarioService.class.getName());
System.out.println(usuario.getMessage());
}
catch (Exception e){
e.printStackTrace();
}
}
}
Vamos precisar adicionar ao build path do nosso projeto 2 arquivos jars, localizados no diretorio de instalação do JBoss:
jboss/client/jbossall-client.jar
jboss/server/default/deploy/jboss-aop.deployer/jboss-aspect-library-jdk50.jar
Feito isso, podemos executar nossa classe de teste e veremos a mensagem contida na implementação do método do nosso componente.
Voltar ao inicio
Fabricio Braga
Ola Fabricio,
Segui todos os passos do tutorial, mas no ultimo passo, obtive o seguinte erro :
javax.naming.NameNotFoundException: com.service.UsuarioService not bound
at org.jnp.server.NamingServer.getBinding(NamingServer.java:529)
at org.jnp.server.NamingServer.getBinding(NamingServer.java:537)
at org.jnp.server.NamingServer.getObject(NamingServer.java:543)
at org.jnp.server.NamingServer.lookup(NamingServer.java:296)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:667)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
at javax.naming.InitialContext.lookup(Unknown Source)
at com.service.ServiceLocator.get(Unknown Source)
at com.testes.TestUsuario.main(Unknown Source)
java.lang.NullPointerException
at com.testes.TestUsuario.main(Unknown Source)
Algum ideia do que possa ser?
Obrigao e parabens!