EJB + SessionFacade

Olá pessoal!

Seguinte: estou fazendo uma aplicação usando ejbs e um ServiceLocator. Bem, pelo que entendi desse padrão de projeto, ele não é um bean, é apenas uma simples classe. Consigo obter interfaces remotas a partir do meu ServiceLocator, porém não consigo obter interfaces locais. Segue abaixo a implementação do meu ServiceLocator:

package jdelegacia.servico;

import java.util.*;

import javax.naming.*;

import javax.ejb.*;

import jdelegacia.persistencia.Util;

public class ServiceLocator {
	private static ServiceLocator me;
	InitialContext context = null;

	private ServiceLocator() {
		try {
			Hashtable props = new Hashtable();
			props.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
			props.put(InitialContext.PROVIDER_URL, Util.getProperty("url_jnp"));
			context = new InitialContext(props);
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static ServiceLocator getInstance() {
		if (me == null) {
			me = new ServiceLocator();
		}
		return me;
	}

	public EJBHome getRemoteService(String servico) {
		try {
			Object obj = context.lookup(servico);
			return (EJBHome) javax.rmi.PortableRemoteObject.narrow(obj, EJBHome.class);
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	public EJBLocalHome getLocalService(String servico) {
		try {
			Object obj = context.lookup(servico);
			return (EJBLocalHome) javax.rmi.PortableRemoteObject.narrow(obj, EJBLocalHome.class);
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

Sempre que uso o método getLocalService(String servico) ele retorna um erro dizendo por exemplo: “Autenticacao not bound”. Mas o bean AutenticacaoBean foi “deployado” com sucesso. Alguém tem alguma idéia?

Obrigado!

Coloque a implementação de sua classe local e verifique se o deploy contém alguma anormalidade…

[quote=“Jalerson”]Olá pessoal!

Seguinte: estou fazendo uma aplicação usando ejbs e um ServiceLocator. Bem, pelo que entendi desse padrão de projeto, ele não é um bean, é apenas uma simples classe. Consigo obter interfaces remotas a partir do meu ServiceLocator, porém não consigo obter interfaces locais. Segue abaixo a implementação do meu ServiceLocator:

package jdelegacia.servico;

import java.util.*;

import javax.naming.*;

import javax.ejb.*;

import jdelegacia.persistencia.Util;

public class ServiceLocator {
	private static ServiceLocator me;
	InitialContext context = null;

	private ServiceLocator() {
		try {
			Hashtable props = new Hashtable();
			props.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
			props.put(InitialContext.PROVIDER_URL, Util.getProperty("url_jnp"));
			context = new InitialContext(props);
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static ServiceLocator getInstance() {
		if (me == null) {
			me = new ServiceLocator();
		}
		return me;
	}

	public EJBHome getRemoteService(String servico) {
		try {
			Object obj = context.lookup(servico);
			return (EJBHome) javax.rmi.PortableRemoteObject.narrow(obj, EJBHome.class);
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	public EJBLocalHome getLocalService(String servico) {
		try {
			Object obj = context.lookup(servico);
			return (EJBLocalHome) javax.rmi.PortableRemoteObject.narrow(obj, EJBLocalHome.class);
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

Sempre que uso o método getLocalService(String servico) ele retorna um erro dizendo por exemplo: “Autenticacao not bound”. Mas o bean AutenticacaoBean foi “deployado” com sucesso. Alguém tem alguma idéia?

Obrigado![/quote]

Olá, vamos por partes…

  • Verifique o nome JNDI do componente que está sendo localizado.
  • Um objeto local, assim como um recurso DataSource não precisa ser convertido em objeto Java local (narrow). Logo, a implementação seria:
public EJBLocalHome getLocalService(String servico) {
		try {
			Object obj = context.lookup(servico);
			return (EJBLocalHome) obj;
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

Bom, complementando crie uma interface Local e atribua a ela um identificador no descritor para que você possa, através deste método recuperá-la.

:okok: