EJB + CDI + JSF + glassfish

criei uma aplicação enterprise no netbeans(JSF2 + CDI + JPA + EJB), como padrão dentro desta aplicação enterprise tenho um módulo ejb(project-ejb) e um módulo web(project-ejb), meu project-ejb tem um webservice que esta rodando de boa, porém agora no projeto web (project-web) preciso criar uma tela de login e pensei em usar o PhaseListener do JSF para controlar o login, porém estou com um problema no LoginBean, eu não consigo injetar uma entidade Usuario que esta no project-ejb, este project-ejb esta no classpath do projet-web porém segue o erro:

// Falha no deploy

Starting GlassFish Server
GlassFish Server is running.
Initial deploying wspurchaseorder to C:\Users\dcunha.NI-61742-0\Documents\NetBeansProjects\wspurchaseorder\dist\gfdeploy\wspurchaseorder
Completed initial distribution of wspurchaseorder
Initializing...
deploy?DEFAULT=C:\Users\dcunha.NI-61742-0\Documents\NetBeansProjects\wspurchaseorder\dist\gfdeploy\wspurchaseorder&name=wspurchaseorder&force=true failed on GlassFish Server 
 Error occurred during deployment: Exception while loading the app : CDI deployment failure:Exception List with 2 exceptions:
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [Usuario] with qualifiers [@Default] at injection point [[BackedAnnotatedField] @Inject private br.com.purchaseorder.view.LoginBean.usuario]
	at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:403)
	at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:325)
	at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:177)
	at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:208)
	at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:519)
	at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:505)
	at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:480)
	at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:536)
	at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:216)
	at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:131)
	at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:328)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:493)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219)
	at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:527)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:523)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:356)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:522)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:546)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1423)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1500(CommandRunnerImpl.java:108)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1762)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1674)
	at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534)
	at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:224)
	at org.glassfish.grizzly.http.server.StaticHttpHandler.service(StaticHttpHandler.java:297)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:246)
	at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
	at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
	at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
	at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
	at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
	at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
	at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
	at java.lang.Thread.run(Thread.java:722)
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [KeyAccess] with qualifiers [@Default] at injection point [[BackedAnnotatedField] @Inject private br.com.purchaseorder.view.ChaveAcessoBean.keyAccess]
	at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:403)
	at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:325)
	at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:177)
	at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:208)
	at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:519)
	at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:505)
	at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:480)
	at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:536)
	at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:216)
	at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:131)
	at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:328)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:493)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219)
	at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:527)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:523)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:356)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:522)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:546)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1423)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1500(CommandRunnerImpl.java:108)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1762)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1674)
	at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534)
	at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:224)
	at org.glassfish.grizzly.http.server.StaticHttpHandler.service(StaticHttpHandler.java:297)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:246)
	at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
	at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
	at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
	at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
	at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
	at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
	at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
	at java.lang.Thread.run(Thread.java:722)
. Please see server.log for more details.

// Bean gerenciado do JSF

import br.com.wspurchaseorder.entity.Usuario;
import br.com.wspurchaseorder.repository.UsuarioRepository;
import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

@RequestScoped
@Named
public class LoginBean implements Serializable {

    @Inject
    private Usuario usuario;
    @Inject
    private UsuarioRepository usuarioRepository;

// Entidade que quero injetar e esta no project-ejb

@Entity
@SequenceGenerator(name = "SEQ_USER", initialValue = 1, sequenceName = "SEQ_USER", allocationSize = 1)
public class Usuario implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_USER")
    private Long id;
    private String login;
    private String senha;
//get set

estou trabalhando errado com o CDI ? como devo proceder neste caso?

removi a anotação do escopo de request e o deploy rolou de boa, a tela de login renderizou, porém ao entrar com os dados e submeter o form tenho outra exception dizendo que meu loginBean esta nulo, alguém se aventura ?

// Removi do loginBean

import javax.enterprise.context.RequestScoped;  
@RequestScoped 

// Exception

INFO:   Running on PrimeFaces 3.5
INFO:   Loading application [wspurchaseorder#wspurchaseorder-war.war] at [/wspurchaseorder-war]
INFO:   wspurchaseorder was successfully deployed in 20.987 milliseconds.
WARNING:   /index.xhtml @19,97 value="#{loginBean.usuario.login}": Target Unreachable, identifier 'loginBean' resolved to null
javax.el.PropertyNotFoundException: /index.xhtml @19,97 value="#{loginBean.usuario.login}": Target Unreachable, identifier 'loginBean' resolved to null
	at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)
	at org.primefaces.renderkit.InputRenderer.findImplicitConverter(InputRenderer.java:170)
	at org.primefaces.renderkit.InputRenderer.findConverter(InputRenderer.java:190)
	at org.primefaces.renderkit.InputRenderer.getConvertedValue(InputRenderer.java:196)
	at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1046)
	at javax.faces.component.UIInput.validate(UIInput.java:976)
	at javax.faces.component.UIInput.executeValidate(UIInput.java:1249)
	at javax.faces.component.UIInput.processValidators(UIInput.java:712)
	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)
	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)
	at org.primefaces.component.panel.Panel.processValidators(Panel.java:297)
	at javax.faces.component.UIForm.processValidators(UIForm.java:253)
	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)
	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)
	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)
	at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1195)
	at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:246)
	at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
	at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
	at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
	at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
	at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
	at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
	at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
	at java.lang.Thread.run(Thread.java:722)
Caused by: javax.el.PropertyNotFoundException: Target Unreachable, identifier 'loginBean' resolved to null

referente à primeira mensagem:

Seu objeto Usuario tem um construtor com parâmetros? Se tem você precisa ter outro construtor sem parâmetros ou criar um método que o “produza” para você.

http://blog.caelum.com.br/customizando-a-producao-de-dependencias-no-cdi

referente à segunda mensagem:

Esse erro ocorre porque o objeto Usuario usuario está nulo, provavelmente, porque não foi injetado. Quando ele tenta fazer usuario.getLogin(), recebe uma NullPointerException.

[quote=wbdsjunior]referente à primeira mensagem:

Seu objeto Usuario tem um construtor com parâmetros? Se tem você precisa ter outro construtor sem parâmetros ou criar um método que o “produza” para você.

http://blog.caelum.com.br/customizando-a-producao-de-dependencias-no-cdi

referente à segunda mensagem:

Esse erro ocorre porque o objeto Usuario usuario está nulo, provavelmente, porque não foi injetado. Quando ele tenta fazer usuario.getLogin(), recebe uma NullPointerException.[/quote]

opa blz maninho,

meu objeto Usuario não tem construtor com parâmetros veja:

@Entity
@SequenceGenerator(name = "SEQ_USER", initialValue = 1, sequenceName = "SEQ_USER", allocationSize = 1)
public class Usuario implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_USER")
    private Long id;
    private String login;
    private String senha;
    // get set

tudo bem que o obeto usuario pode não ter sido injetado mas a mensagem brother é que o próprio bean gerenciado do JSF(LoginBean) esta nulo veja:

Caused by: javax.el.PropertyNotFoundException: Target Unreachable, identifier 'loginBean' resolved to null

tem razão.

você tem o arquivo WebContent/WEB-INF/beans.xml? Acho que o NetBeans cria o arquivo automaticamente quando, na criação do projeto, você informa que quer usar CDI, mas não custa perguntar.

[quote=wbdsjunior][quote=aix]
tudo bem que o obeto usuario pode não ter sido injetado mas a mensagem brother é que o próprio bean gerenciado do JSF(LoginBean) esta nulo veja:

Caused by: javax.el.PropertyNotFoundException: Target Unreachable, identifier 'loginBean' resolved to null

[/quote]
tem razão.

você tem o arquivo WebContent/WEB-INF/beans.xml? Acho que o NetBeans cria o arquivo automaticamente quando, na criação do projeto, você informa que quer usar CDI, mas não custa perguntar.[/quote]

sim, tem sim, sera que tem algo a ver com as versões ?

tipo estou utilizando neste projeto:

primefaces 3.5
glassfish 4
JavaEE 7

não era pra ter nenhum rolo né, realmente não estou entendendo :frowning:

quando o container starta ele da uns warns mas acredito não ser isto o problema veja:

WARNING:   Container org.glassfish.webservices.JAXWSContainer@12120a8 doesn't support class com.sun.xml.ws.api.server.Module
INFO:   EJB5181:Portable JNDI names for EJB ReceivesDocument: [java:global/wspurchaseorder/wspurchaseorder-ejb/ReceivesDocument!br.com.wspurchaseorder.ws.receivesdocument.ReceivesDocument, java:global/wspurchaseorder/wspurchaseorder-ejb/ReceivesDocument]
INFO:   WELD-000900 2.0.0 (SP1)
WARNING:   Class 'javax.ejb.PostActivate' not found, interception based on it is not enabled
WARNING:   Class 'javax.ejb.PrePassivate' not found, interception based on it is not enabled
INFO:   EJB Endpoint deployed wspurchaseorder
  listening at address at http://ni-61742-0:8080/ReceivesDocument/ReceivesDocument
INFO:   Initializing Mojarra 2.2.0 ( 20130502-2118 https://svn.java.net/svn/mojarra~svn/tags/2.2.0@11930) for context '/wspurchaseorder-war'
WARNING:   WELD-001529 An InjectionTarget implementation is created for a class org.primefaces.context.PrimePartialViewContextFactory which does not have any appropriate constructor.
INFO:   Monitoring jndi:/server/wspurchaseorder-war/WEB-INF/faces-config.xml for modifications
INFO:   Running on PrimeFaces 3.5
INFO:   Loading application [wspurchaseorder#wspurchaseorder-war.war] at [/wspurchaseorder-war]
INFO:   wspurchaseorder was successfully deployed in 22.229 milliseconds.
WARNING:   /index.xhtml @19,97 value="#{loginBean.usuario.login}": Target Unreachable, identifier 'loginBean' resolved to null

Meu!

Fiz um teste. Criei um projeto com as mesmas características que o seu (Java EE 7 e Glassfish 4) pelo NetBeans 7.3.1 e tive o mesmo problema.

Pesquisei no Google e vi que várias pessoas tem o mesmo problema e não conseguiram resolver. Vi também que várias Inssues foram abertas para a equipe de desenvolvimento do GlassFish (o que não quer dizer muita coisa).

Enfim. Isso funcionou para mim. Não pesquisei porque (estou sem tempo).

Mudar o conteúdo do beans.xml para algo como:

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

<weld:scan>
    <weld:exclude name="br.com.guj.**"/>
</weld:scan>

[/code]

[quote=wbdsjunior]Meu!

Fiz um teste. Criei um projeto com as mesmas características que o seu (Java EE 7 e Glassfish 4) pelo NetBeans 7.3.1 e tive o mesmo problema.

Pesquisei no Google e vi que várias pessoas tem o mesmo problema e não conseguiram resolver. Vi também que várias Inssues foram abertas para a equipe de desenvolvimento do GlassFish (o que não quer dizer muita coisa).

Enfim. Isso funcionou para mim. Não pesquisei porque (estou sem tempo).

Mudar o conteúdo do beans.xml para algo como:

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

<weld:scan>
    <weld:exclude name="br.com.guj.**"/>
</weld:scan>

[/code][/quote]

obrigado por ajudar wbdsjunior, vou executar mais testes e também com o que você falou, este problema acabou me atrasando hoje, mas não sou de desistir :), encontrando como fazer posto aqui, vlw por enquanto.