Fábrica de inicialização de EJB

1 resposta
elugo

Boa tarde galera! Estou precisando implementar uma factory para inicialização de EJBs por lookup.
vou receber uma key e pegar o valor do jndi em um arquivo de properties. Atravéz deste jndi, eu farei o lookup e retornarei o EJB instanciado.
Gostaria que me ajudassem a fazer uma classe que fosse genérica e que tivesse um método estático que retornasse o objeto sem precisar fazer cast na chamada.
Implementei a seguinte classe:

public class ServiceFactory {
    
    static final Logger _log = Logger.getLogger(ServiceFactory.class);
    
    static final Properties properties = new Properties();
    
    public static <T> T getInstance(String key) {
        try {
            if (properties.values().isEmpty())
                loadProperties();
            String jndiBinding = properties.getProperty(key);
            Context ctx = new InitialContext();
            return (T) ctx.lookup(jndiBinding);
        } catch (NamingException e) {
            throw new RuntimeException("O nome do JNDI da Service não foi encontrado.");
        }
    }
    
    private static void loadProperties() {
        try {
            InputStream inputStream = ServiceFactory.class.getClassLoader().getResourceAsStream("service-impl.properties");
            properties.load(inputStream);
        } catch (IOException e) {
            _log.error(e.getMessage(), e, "");
            e.printStackTrace();
        }
    }
}

e na chamada ficaria assim :

IClienteBO service = (IClienteBO)ServiceFactory.getInstance("key.ejb");

Queria que me ajudassem a melhorar esse código para que eu não precise desse cast na chamada. vlw

1 Resposta

F

Tente dessa forma…é uma ajuda rápida, acho que tem como fazer lookup usando direto o class.

public class ServiceFactory {
    
    static final Logger _log = Logger.getLogger(ServiceFactory.class);
    
    static final Properties properties = new Properties();
    
    public static <T> T getInstance(Class<T> entityType, String key) {
        try {
            if (properties.values().isEmpty())
                loadProperties();
            String jndiBinding = properties.getProperty(key);
            Context ctx = new InitialContext();
            return (T) ctx.lookup(jndiBinding);
        } catch (NamingException e) {
            throw new RuntimeException("O nome do JNDI da Service não foi encontrado.");
        }
    }
    
    private static void loadProperties() {
        try {
            InputStream inputStream = ServiceFactory.class.getClassLoader().getResourceAsStream("service-impl.properties");
            properties.load(inputStream);
        } catch (IOException e) {
            _log.error(e.getMessage(), e, "");
            e.printStackTrace();
        }
    }
}

e na chamada ficaria assim :

IClienteBO service = ServiceFactory.getInstance(IClienteBO.class, "key.ejb");

elugo:
Boa tarde galera! Estou precisando implementar uma factory para inicialização de EJBs por lookup.
vou receber uma key e pegar o valor do jndi em um arquivo de properties. Atravéz deste jndi, eu farei o lookup e retornarei o EJB instanciado.
Gostaria que me ajudassem a fazer uma classe que fosse genérica e que tivesse um método estático que retornasse o objeto sem precisar fazer cast na chamada.
Implementei a seguinte classe:

public class ServiceFactory {
    
    static final Logger _log = Logger.getLogger(ServiceFactory.class);
    
    static final Properties properties = new Properties();
    
    public static <T> T getInstance(String key) {
        try {
            if (properties.values().isEmpty())
                loadProperties();
            String jndiBinding = properties.getProperty(key);
            Context ctx = new InitialContext();
            return (T) ctx.lookup(jndiBinding);
        } catch (NamingException e) {
            throw new RuntimeException("O nome do JNDI da Service não foi encontrado.");
        }
    }
    
    private static void loadProperties() {
        try {
            InputStream inputStream = ServiceFactory.class.getClassLoader().getResourceAsStream("service-impl.properties");
            properties.load(inputStream);
        } catch (IOException e) {
            _log.error(e.getMessage(), e, "");
            e.printStackTrace();
        }
    }
}

e na chamada ficaria assim :

IClienteBO service = (IClienteBO)ServiceFactory.getInstance("key.ejb");

Queria que me ajudassem a melhorar esse código para que eu não precise desse cast na chamada. vlw

Criado 3 de abril de 2011
Ultima resposta 3 de abr. de 2011
Respostas 1
Participantes 2