Software, Java & afins

Fabricio Braga, Sun Certified

Parte 4

Jan-29-2006 By Fabricio Braga

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

  1. Claudio Said,

    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!