Glassfish v3 - di ejb remote

Pessoal alguém teve esse problema:

	@EJB(name="hello")
	private HelloEjbRemote ejbRemote;

SEVERE: Class [ Lebjs/HelloEjbRemote; ] not found. Error while loading [ class servlets.TesteServ ]
WARNING: Error in annotation processing: java.lang.NoClassDefFoundError: Lebjs/HelloEjbRemote;
WARNING: This web app [/opt/glassfish/domains/domain1/eclipseApps/ProjClientWeb/] has no ejb reference by the name of [hello]
SEVERE: Exception while invoking class org.glassfish.ejb.startup.EjbDeployer load method

Note: Lebjs/HelloEjbRemote;

Esse L antes de ebjs/HelloEjbRemote parece ser a causa do problema.

Alguem sabe a causa disto no glassfish?

Você postou muito poucas informações sobre o problema. Mas pelo que notei no título você está tentando injetar um EJB remoto, correto?

Não existe como fazer injeção de dependencia remota. DI você consegue apenas para objetos locais ou que estejam na mesma VM. Mas você pode usar um service locator para isso.

Exato.
Fiz o deploy do EJB no servidor

E fiz o deploy de um .war que consome esse EJB

Eles estão no mesmo servidor mas em arquivos separados

O que eu quero e fazer meu .war consumir serviços do EJB
é possivel fazer isto?

eu coloquei o seguinte no arquivo sun-web.xml

	<ejb-ref>
		<ejb-ref-name>hello</ejb-ref-name>
		<jndi-name>java:global/ProjEjb01/HelloEjb</jndi-name>
	</ejb-ref>

Como eu disse, você não consegue mesmo fazer injeção de dependencia quando um EJB é remoto. Injeção de dependencia funciona apenas com componentes (bean ou resources) locais.

O que você pode fazer é usar o antigo Service Locator. No glassfish um service locator é conforme meu exemplo abaixo. Note que o glassfish exporta os EJBs com o full qualified name da interface remota do EJB quando você tem apenas “uma interface por bean”.

[code]public final class ServiceLocator {

private static final InitialContext ctx;

static {
    try {
        ctx = new InitialContext();
    } catch (NamingException e) {
        logger.error(EJB_INFRAESTRUCTURE_LOOKUP, e);
        throw new InfraestructureException(EJB_INFRAESTRUCTURE_LOOKUP);
    }
}

public static <T> T lookup(Class<T> clazz) {
    try {
        logger.info("looking for EJB {}", clazz);
        return (T) ctx.lookup(clazz.getName());

    } catch (NamingException e) {
        throw new InfraestructureException(e);
    }
}

}[/code]

RESOLVIDO

vc pode sim fazer o deploy do ejb em um arquivo separado
e colocar app web .war consumindo esses ejb por injeção de dependencia (EJb 3.1)

basta colocar as interfaces dentro da app web que vai consumir os ejbs

obrigado.

Olá,

Desculpem reviver o tópico, procurei por aqui e no Google e não encontrei uma resposta satisfatória.
Se tenho uma aplicação Web com Struts eu consigo na Action “Injetar” um EJB? Ele precisa estar no mesmo projeto? Ou Preciso apenas ter acesso a sua Interface?

Em meus testes chamei via Lookup um EJB através de sua interface Local e funcionou normalmente(Mesmo o EJB estando em projeto separado e já deployado)
Tentei injetar (via @EJB) o mesmo EJB e não funcionou.

Utilizo JBOSS 6 M4, é possível?

Grato,

Não, não é possível e nem com reza de pai de santo você consegue injetar um EJB em Struts.

Injeção em EJB só funciona para beans stateless e quando o bean que receberá a injeção seja gerenciado pelo container. Isso vale para JSF e Servlets, mas não para beans do Struts.

Eu nao entendi bem o que vc quer fazer, mas eu abri esse forum e eu mesmo respondi

consegui fazer uma aplicacao web .war consumir um ejb remoto (com anotacoes e ejb 3.1)

Deve ser possivel do struts tambem.

Se vc usa struts2 você poderá usar spring para fazer DI, e ele já possui uma tag para injetar EJB remote e local.

[quote=idev4web]Eu nao entendi bem o que vc quer fazer, mas eu abri esse forum e eu mesmo respondi

consegui fazer uma aplicacao web .war consumir um ejb remoto (com anotacoes e ejb 3.1)

Deve ser possivel do struts tambem.[/quote]

Olá, vc injetou um EJB Remoto? Ou fez Lookup do mesmo?

Se for Injetado, precisa de alguma configuração extra?

Pois de faço: @EJB IBeanQueroInjetar beanQueroInjetar ele dá erro no Deploy
E se for: beanQueroInjetar = (IBeanQueroInjetar) context.lookup(IBeanQueroInjetar.JNDI_Name) funciona normalmente