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

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.

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.

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!

[quote=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.[/quote]

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

[quote=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![/quote]

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

[quote=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![/quote]

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;
    }

To usando um service Locator.

Segue a classe:

[code]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;
}

}[/code]

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