Nao consigo injetar um EJB3.1 em um jsf2.0! HELP! [RESOLVIDO]

Eu fiz um projeto para JPA2.0, um para EJB3.1 (acessando o jpa) e um outro projeto JSF2.0 que tenta acessar o EJB usando o @EJB.

Todos os projetos rodam jUnit e estão ok, inclusive quando faco deploy da aplicação(todos dentro do mesmo EAR) no glassfishv3 ele mostra o jndi do meu ejb.

Acontece que ele não injeta (instancia) o ejb dentro do meu managedBean e não dá erro algum, apenas lança um nullpointer quando tento executar um de seus métodos.

Code, show us some code :slight_smile:

Vou chutar alguma coisa aqui… provavelmente estou falando caca. Quando você injeta, ele não é criado até terminar o construtor. A annotation @PostConstruct pode dar uma ajuda (disponível aqui). Sei lá cara, veja o ciclo de vida (com debugger mesmo) desse ManagedBean ou algo do gênero.

vc pode me mostrar qual a estrutura "padrao"de um ear?

pelo q entendi seria assim:

projeto.ear
    ejb.jar(ejb-jar.xml é opcional)
    /lib
        persistence.jar(JPA)
        ejb-client.jar(interfaces do ejb)
        outros jars quaisquer
    projWeb.war(com web.xml)
    /META-INF
        persistence.xml

esta correto?

Fiz um exemplo no meu blog usando EJB injeto em servlet e esta tudo funcionando. Veja se te ajuda em algo.

http://www.rodrigolazoti.com.br/pt/2009/12/14/testando-javaee-6-com-glassfish-e-eclipse/

PS: Agora no JEE6, voce pode colocar tudo no mesmo projeto e gerar um unico war.

Ficou bem legal agora a construção de um servlet…nada de declarações no web.xml…

rlazoti vi teu exemplo mas não é bem o que estou tentando (apesar que é parecido)

meu ear tem um ejb.jar e um web.war e em seu lib tem ejb-client.jar e jpa.jar

quando faco o deploy é mostrado no console:

INFO: Portable JNDI names for EJB CustomerEJB : [java:global/classicModels_EAR/classicModels_EJB/CustomerEJB!com.classicmodels.ejb.dao.CustomerEJBLocal, java:global/classicModels_EAR/classicModels_EJB/CustomerEJB!com.classicmodels.ejb.dao.CustomerEJBRemote]
INFO: Glassfish-specific (Non-portable) JNDI names for EJB CustomerEJB : [com.classicmodels.ejb.dao.CustomerEJBRemote#com.classicmodels.ejb.dao.CustomerEJBRemote, com.classicmodels.ejb.dao.CustomerEJBRemote]

e meu ManagedBean do JSF tem este trecho:

@EJB
private CustomerEJB cEjb;

acontece que quando esse cEjb é chamado ele está como null. Até tentei passar os valores que sairam no console nos atributos “name” e “lookup” do @EJB mas nada funcionou.

Alguma sugestao?

obs: fora o nullpointer quando tento usar o cEjb nao ocorre nenhum outro erro na aplicacao.

Adicionei o @PostConstruct mas ele não cai dentro do método… Ele deveria ser chamado durante o deploy ou ao ser chamado em algum objeto?

Por ele nao entrar no @PostConstruct dá a entender que não estão funcionando meus ejb, mas durante o deploy seus nomes aparecem, inclusive se adiciono o mappedName=“testeCustomerEJB” ele mostra depois no console o ejb com este nome para jndi.

Alguma sugestão?

[quote=fausto]Adicionei o @PostConstruct mas ele não cai dentro do método… Ele deveria ser chamado durante o deploy ou ao ser chamado em algum objeto?

Por ele nao entrar no @PostConstruct dá a entender que não estão funcionando meus ejb, mas durante o deploy seus nomes aparecem, inclusive se adiciono o mappedName=“testeCustomerEJB” ele mostra depois no console o ejb com este nome para jndi.

Alguma sugestão?[/quote]

Voce esta usando o glassfish v3 web profile ou o full?

Sabe que nao sei :lol: estou usando o que veio com o netbeans, apesar de rodar pelo eclipse.

O estranho é que usando:

 Context ctx = new InitialContext();
 cEjb = (CustomerEJBRemote) ctx.lookup("testeCustomerEJB");

Ele consegue achar o ejb e funciona tudo normal, inclusive chamando o @PostConstrut (inclusive ele só é chamado qdo executo algum metodo do bean e não quando consigo uma referencia a ele)

Mas quando tento algo tipo

@EJB(lookup="testeCustomerEJB")
private CustomerEJBRemote cEjb;

Não funciona… Já tentei sem parametros, usando o lookup e o name, mas nada ainda…

O que pode ser? o EJB e JSF estao todos no mesmo EAR

Consegui fazer funcionar aqui, mas estranhamente ele dá erro quando chamo o ejb no construtor do ManagedBean, existe alguma razão para isto? Se chamo de algum método funciona corretamente.

Acho que tem sim… Só é injetado depois de terminar o construtor (vide o meu primeiro comentário - eu tirei aquilo ou algo parecido com aquilo da documentação do JBoss, na parte de EJB 3).

Como você resolveu?

Acho que foi a descrição dos web.xml e application.xml. O eclipse criou configurando p versões antigas do j2ee. Eu criei um projeto no netbeans testei e vi que funcionava, ai copiei as configuracoes p meu projeto no eclipse.

Estranho q fiz um projeto web no netbeans e ele nem criou o web.xml, mas funciona o jsf! Tipo não tá configurado o servlet e o caminho faces/* já que não existe o web.xml, mas funciona mesmo assim!! Mas isso já é outra coisa. O problema do ejb foi resolvido. :wink:

fausto, estou como o mesmo problema você teve!
vc pode postar o seu web.xml e aplication.xml ?!

[quote=marceloscunha@gmail.com]fausto, estou como o mesmo problema você teve!
vc pode postar o seu web.xml e aplication.xml ?! [/quote]

Opa Marcelo, resgatou esse tópico hem :lol:

Então, fucei aqui e achei o projeto que estava usando de teste. No final das contas foi decidido não usar ejb nos projetos, então estou a mais de 1 ano sem brincar com ele. Eu sugiro que você tente gerar os projetos pelas últimas versões das IDEs, o netbeans mesmo tem wizards muitos bons para isso. Na época que mexi o jee6 era novidade e por isso tinha alguns problemas para configurar, mas hoje as IDEs devem conseguir. De qualquer forma segue abaixo o web.xml e application.xml

[code]<?xml version='1.0' encoding='UTF-8'?>

<display-name>Facelets Tutorial</display-name>
<description>Number Guess Game</description>
<!-- Change to "Production" when you are ready to deploy -->
<context-param>
	<param-name>javax.faces.PROJECT_STAGE</param-name>
	<param-value>Development</param-value>
</context-param>
<!-- Faces Servlet -->
<servlet>
	<servlet-name>Faces Servlet</servlet-name>
	<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
	<load-on-startup>1</load-on-startup>
</servlet>

<!-- Faces Servlet Mapping -->
<servlet-mapping>
	<servlet-name>Faces Servlet</servlet-name>
	<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<!-- welcome file mapping -->
<welcome-file-list>
	<welcome-file>faces/hello.xhtml</welcome-file>
</welcome-file-list>
[/code]
<?xml version="1.0" encoding="UTF-8"?>
<application version="6" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd">
	<display-name>classicModels_EAR</display-name>
	<module>
		<ejb>classicModels_EJB.jar</ejb>
	</module>
	<module>
		<web>
			<web-uri>classicModels_JSF.war</web-uri>
			<context-root>classicModels_JSF</context-root>
		</web>
	</module>
</application>

Depois nos diga se deu certo,
abs

fausto,

consegui!

é o web.xml!

obrigado pela ajuda!