[RESOLVIDO] EJB + JSF = NameNotFoundException?

4 respostas
R

Pessoal,

Estou estudando EJB3 (comprei o livro Enterprise JavaBeans 3.0 5th Edition, do Bill Burkes). Estou tentando fazer uma aplicação exemplo do livro… mas na camada de apresentação eu tou tentando usar JSF… estou tentando injetar o SessionBean via annotation @EJB, mas nao consigo… Já vi alguns topicos semelhantes por aqui mas não achei nenhum com resposta. Alguns sugerem JBoss Seam, outros não chegaram a concluir o tópico. Mas tou tentando aprender “na unha” pra entender por que está errado e/ou por que não é possível fazer o que estou tentando.

Basicamente, o que estou fazendo é:

//interface remota
@Remote public interface I {}

//session bean
@Stateless public class A implementes I {}

//bean do JSF
public class MBean {
   @EJB private I meuEJB;

   public String m() {
      //se tentar acessar this.meuEJB, ele está null;
   }
}

Quando tento da forma acima, no console tá exibindo NameNotFoundException (n ta achando o nome do stateless bean) mas se eu for olhar no jmx-console, existe o bean que estou tentando injetar (além disso, no console, na hora do deploy, tb disse que startou o EJB com sucesso).

Já li em outras fontes e vi alguns comentarios nao diretamente ligados a esse problema, mas algo do tipo “ate onde eu sei, nao da pra injetar EJB em beans nao gerenciados pelo servidor via annotation”, ou “pra colocar EJB em bean nao gerenciado precisa fazer um lookup”, ou “se os beans estiverem em pacotes diferentes, nao da pra injetar se a interface for Local”.

Antes a interface era Local, mudei pra Remote e nada… ja tentei fazer um lookup a partir do bean do JSF e dava um erro que nao tinha achado uma instancia “bound” do bean do JSF (creio que signifique não-registrado-no-JNDI).

O desenvolvimento e deploy que estou fazendo eh da seguinte maneira (usando Eclipse + WTP e JBoss):

  1. criei um projeto EJB e coloquei os beans mapeados com JPA, a interface Remote e o Stateless Bean.
  2. criei um projeto Web com JSF
  3. criei um projeto Enterprise e coloquei os modulos, de forma que quando eu peco pra gerar o .ear desse projeto, o conteudo tem um .jar (do projeto ejb), um .war (do projeto web) e no META-INF o application.xml declarando os modulos.

Alguém sabe me dizer o que estou errando? Ou se realmente eu nunca conseguiria fazer isso desse jeito, pois n da pra injetar no bean do JSF (se as suposições acima forem verdadeiras), sei la… to perdido nisso ja ha uns 2 dias, quem puder ajudar, agradeço.

  • Só lembrando que estou tentando fazer sem usar frameworks como Spring ou Seam.

4 Respostas

R

Boa noite Rafael!!

Cara, estou tendo o mesmo problema…

Correndo atráz da solução descobri varias coisas, dentre uma delas que isto é um BUG do jboss, olha o issue abaixo:
http://jira.jboss.com/jira/browse/JBPAPP-192

Partindo disso comecei a testar em outros App Server’s, o OC4J da oracle até rola, mas precisa fazer um descriptor dos ejb’s igual a versão 2.1 (fala sério né!!!) e um tal de jndi.properties (que gostei mas ainda preciso me aprofundar no assunto).

Já o glassfish foi muito satisfatório cara, de primeira e sem erros nenhum, injetou.
Tentei usar a versão 4.2.2 do JBoss, já que o issue tem fix no 4.2.0, mas mesma coisa… mesmo erro… agora vou testar com o 5.0 Beta…

Mas olhando o JBoss 4.2 e o OC4J 10.1.33 a definição deles é que são contaiters J2EE 1.4 com suporte a EJB3, ja o GlassFish é um container pra JEE 5, o que aparentemente faz toda a diferença… tente o deploy nele, depois poste pra nós…

Pessoal, alguém ja passou pelo mesmo problema? Ou alguém teve sucesso nisso?
Não sei se é impressão mas os App Servers estão “amadurecendo” agora essa parte do JEE 5…

Bom… é isso ai cara… qualquer coisa posta aqui… esse assunto deve interessar bastante gente creio eu…

Abraços,

Rodrigo

R

Oi, Rodrigo.
Obrigado pela resposta.

Entrei no link que vc informou e lá aponta pra um outro link:
http://www.jboss.com/index.html?module=bb&op=viewtopic&t=107353

Nesse link, ensina como injetar EJB no backing-bean, mas dá um trabalho a mais… precisa colocar o atributo name na annotation @EJB e declará-lo em um descritor ( :cry: )

Pelo que entendi nesse link, apenas a versão 5.GA do JBoss é que terá total suporte ao Java EE 5.

Vou baixar o Glassfish e testar sem configurações adicionais pra ver se funciona. Depois coloco o resultado aí.

Valeu.

R

Testei com o GlassFish V2 e, depois de apanhar um pouquinho com besteira na configuração do Pool JDBC, consegui colocar tudo pra funcionar… inclusive injetando EJB no Bean do JSF via Annotation @EJB.

Acho que, com isso, dá pra concluir que isso é um issue da versão 4.2.2.GA do JBoss, mas que estará resolvida até a versão final 5.0.0.GA.

T

isso mesmo também tive o mesmo problema… A solução para ainda utilizar o JBoss é fazer um ServiceLocator e realizar as buscas no JNDI

Criado 27 de novembro de 2007
Ultima resposta 29 de nov. de 2007
Respostas 4
Participantes 3