O que significa "attempting to inject Unresolved Ejb-Ref"? (Java EE 5)[RESOLVIDO]

4 respostas
R

Olá pessoal,

Estou migrando uma aplicação web de Java EE 6 para Java EE 5. Tive de fazer algumas alterações. Uma delas é em relação ao EJB. Antes eu possuia uma classe de servicço com a anotação @Stateless e no meu ManagedBean(JSF2.0) eu apenas declarava uma varíavel com a anotação @EJB. Tudo funcionava perfeitamente.

Quando fiz a migração, além de problemas com JPA que eu já resolvi, tive um problema com este tal de EJB. Ele me diz o seguinte:

Caused by: com.sun.faces.spi.InjectionProviderException: com.sun.enterprise.InjectionException: Exception attempting to inject Unresolved Ejb-Ref br.ceptro.solicitarAcesso.managedBeans.LoginBean/userServices@jndi: ejb/UsuarioServices@[email removido]@Session@null into class br.ceptro.solicitarAcesso.managedBeans.LoginBean at com.sun.faces.vendor.GlassFishInjectionProvider.inject(GlassFishInjectionProvider.java:97) at com.sun.faces.mgbean.BeanBuilder.injectResources(BeanBuilder.java:205) ... 55 more Caused by: com.sun.enterprise.InjectionException: Exception attempting to inject Unresolved Ejb-Ref br.ceptro.solicitarAcesso.managedBeans.LoginBean/userServices@jndi: ejb/UsuarioServices@[email removido]@Session@null into class br.ceptro.solicitarAcesso.managedBeans.LoginBean at com.sun.enterprise.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:387) at com.sun.enterprise.util.InjectionManagerImpl.inject(InjectionManagerImpl.java:206) at com.sun.enterprise.util.InjectionManagerImpl.injectInstance(InjectionManagerImpl.java:127) at com.sun.faces.vendor.GlassFishInjectionProvider.inject(GlassFishInjectionProvider.java:93) ... 56 more Caused by: javax.naming.NameNotFoundException: UsuarioServices#br.ceptro.solicitarAcesso.servicos.UsuarioServices not found

Eu possuo no meu EJB:

@Stateless(mappedName="ejb/UsuarioServices") public class UsuarioServices implements UsuarioServicesInterface

Na interface (me disseram que eu precisava criar uma com os métodos que aquele EJB faz - Também coloquei o local sei lá pra que)

@Local public interface UsuarioServicesInterface

No meu managedBean:

@EJB(mappedName="ejb/UsuarioServices") protected UsuarioServices userServices;

E agora Jesus? Não roda nem a pau.

4 Respostas

rafa_c

Ricardo,

não existe o mappedName para a annotation @Stateless, o correto é name=""

Troca:

@Stateless(mappedName="ejb/UsuarioServices")
public class UsuarioServices implements UsuarioServicesInterface

Por:

@Stateless(name="ejb/UsuarioServices")
public class UsuarioServices implements UsuarioServicesInterface

[]s

Rafa

R

Mesmo erro.

Caused by: com.sun.faces.spi.InjectionProviderException: com.sun.enterprise.InjectionException: Exception attempting to inject Unresolved Ejb-Ref br.ceptro.solicitarAcesso.managedBeans.LoginBean/userServices@jndi: ejb/UsuarioServices@[email removido]@Session@null into class br.ceptro.solicitarAcesso.managedBeans.LoginBean at com.sun.faces.vendor.GlassFishInjectionProvider.inject(GlassFishInjectionProvider.java:97) at com.sun.faces.mgbean.BeanBuilder.injectResources(BeanBuilder.java:205) ... 55 more Caused by: com.sun.enterprise.InjectionException: Exception attempting to inject Unresolved Ejb-Ref br.ceptro.solicitarAcesso.managedBeans.LoginBean/userServices@jndi: ejb/UsuarioServices@[email removido]@Session@null into class br.ceptro.solicitarAcesso.managedBeans.LoginBean

R

Estava usando o mappedName pq o javadoc diz:

A product specific name(e.g. global JNDI name) that this session bean should be mapped to. Application servers are not required to support any particular form or type of mapped name, nor the ability to use mapped names. The mapped name is product-dependent and often installation-dependent. No use of a mapped name is portable.

R

[size=18] Resolvido:[/size]

Para resolver o problema foi preciso fazer sérias alterações no projeto.

Criar uma interface para cada EJB (copiei a classe e apaguei as implementações)

Na implementação, alterei a declaração dos EJBs e implementei a interface:

@Stateless @Remote(UsuarioServicesInterface.class) public class UsuarioServices implements UsuarioServicesInterface{

No managedBean, deixei apenas o @EJB e alterei o tipo da variavel para o tipo da Interface:

@EJB protected UsuarioServicesInterface userServices;

Depois, separei todos os EJBs em um jar.

Criei um projeto Web e adicionei os managedBeans + facelets.
Adicionei o meu jar dos EJB às bibliotecas.

Fiz o deploy do war e tudo passou a funcionar.

Valeu galera!

Criado 29 de novembro de 2010
Ultima resposta 30 de nov. de 2010
Respostas 4
Participantes 2