Modulo WEB e modulo EJB separados nao funcionam?[RESOLVIDO]

7 respostas
thimor

Ola,

Gostaria de saber se ao criar um modulo EJB separado e coloca-lo no glassfish e depois criar um modulo WEB e colocado no glassfish sem construir esses modulos em uma aplicacao enterprise, funciona?

Criei dois projetos no netbeans um foi um modulo ejb e o outro um projeto web com jsf. Ao utilizar a anotacao @EJB ele nao encontra os ejbs. Depois de muitas tentativas criei um projeto enterprise e com o mesmo codigo funcionou tudo certo.

So tem como trabalhar desta forma? Pois se for assim fica muito acoplado pois eu preciso de um modulo EJB(modelo e persistencia) para utilizar com dois outros modulos WEB com controles diferentes.

Grato pelas respostas.

7 Respostas

victor.godinho

Não entendo de peculiaridades do GlashhFish, mas em relação ao contexto “criar um módulo separado de EJB, e um separado WEB, com comunicação entre eles”, funciona sim.

Na verdade não sei porque não funcionaria, você apenas deve: criar os EJB’s e disponibilizar no servidor.
Ir no projeto WEB e fazer lookup deles. Context ctx = new InitialContext(); …

Dê uma pesquisada melhor que você vai achar uns 10 mil sites mostrando um exemplo simples disso.

L

Thimor, aqui eu uso assim:

Isso funciona no Glassfish beleza… Tenta aí e vê se dá certo. :wink:
Ah, não esquece a anotação no EJB:

Abraços!

thimor

victor.godinho:
Não entendo de peculiaridades do GlashhFish, mas em relação ao contexto “criar um módulo separado de EJB, e um separado WEB, com comunicação entre eles”, funciona sim.

Na verdade não sei porque não funcionaria, você apenas deve: criar os EJB’s e disponibilizar no servidor.
Ir no projeto WEB e fazer lookup deles. Context ctx = new InitialContext(); …

Dê uma pesquisada melhor que você vai achar uns 10 mil sites mostrando um exemplo simples disso.

Exato. Concordo com voce e ja fiz isso muitas vezes. Porem utilizando injecao de dependencias nos projetos separados nao funcionou. Ao invez de utilizar o lookup eu tente utilizar o

@EJB
SessionBeanLocal sessionBeanLocal
thimor

lilikadias:
Thimor, aqui eu uso assim:

Isso funciona no Glassfish beleza… Tenta aí e vê se dá certo. :wink:
Ah, não esquece a anotação no EJB:

Abraços!

Blz eu ja suspeitava q so iria funcionar usando lookup. Blz valeu ae
[]'s
Ate mais.

thimor

lilikadias:
Thimor, aqui eu uso assim:

Isso funciona no Glassfish beleza… Tenta aí e vê se dá certo. :wink:
Ah, não esquece a anotação no EJB:

Abraços!

Voce esta usando o servicelocator ou singleton para recuperar o objeto remoto correto? voce tem o exemplo do codigo completo? pois estou usando dessa forma dentro da propria classe de controle

private TesteRemote getRemoteBean() {

        try {
            // TODO code application logic here
            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");
            props.put(Context.PROVIDER_URL, "iiop://localhost:2809");
            //props.put(Context.PROVIDER_URL, "localhost:1099");
            Context ctx = new InitialContext(props);
            TesteRemote remote = (TesteRemote) ctx.lookup("ejb/TesteBean");
            return remote;

        } catch (NamingException ex) {
            Logger.getLogger(ControleDepto.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
L

To usando um service Locator.

Segue a classe:

public class ServiceLocator {

    private InitialContext jndiContext;
    private Map<String, Object> cache;
    private NameResolver nameResolver;

    private ServiceLocator(){

        try{
            jndiContext = new InitialContext();
            Map<String, Object> cRef = new HashMap<String, Object>();
            cache = Collections.synchronizedMap(cRef);
            nameResolver = new GlassfishNameResolver();
        }
        catch(NamingException ex){
            ex.printStackTrace();
        }
    }

    @SuppressWarnings("unchecked")
	public Object getRemoteEJB(Class ejbInterface) throws Exception {

        String jndiName = nameResolver.resolveNameForRemoteEJB(ejbInterface);
        Object result = cache.get(jndiName);

        if(result == null){
            result = jndiContext.lookup(jndiName);
            cache.put(jndiName, result);
        }

        return result;
    }

    @SuppressWarnings("unchecked")
	public Object getLocalEJB(Class ejbInterface) throws Exception {

        String jndiName = nameResolver.resolveNameForLocalEJB(ejbInterface);
        Object result = cache.get(jndiName);

        if(result == null){
            result = jndiContext.lookup(jndiName);
            cache.put(jndiName, result);
        }

        return result;
    }

    private static ServiceLocator instance;

    public static synchronized ServiceLocator getInstance(){

        if(instance == null){
            instance = new ServiceLocator();
        }
        return instance;
    }
}
thimor

Realmente funcionou tendo que utilizar a interface remota e o ctx.lookup. Nao funcionou utilizando a anotacao @EJB

Criado 5 de fevereiro de 2009
Ultima resposta 6 de fev. de 2009
Respostas 7
Participantes 3