Weld-000072 Erro usando injeção de dependência no jsf2 (netbeans)

Olá a todos,

Tenho um projeto feito em netbeans 6.9 com jsf 2.0 e jpa 2.0. Estou tentando utilizar injeção de dependência com o Weld mas estou parado com um erro que não consegui resolver. Abaixo o erro que aparece e logo depois as minhas classes e o persistence.xml.

Erro gerado…

[quote]SEVERE: Exception while loading the app
org.glassfish.deployment.common.DeploymentException: WELD-000072 Managed bean declaring a passivating scope must be passivation capable. Bean: org.jboss.weld.bean-/D:/Daniel/Estudos/projEstudos/Netbeans/comprovantesSefazPI/build/web/-ManagedBean-class br.gov.pi.sefaz.comprovantes.convenio115.mb.Convenio115MB
at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:169)
at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:125)
at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:224)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:338)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:183)
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:272)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:305)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:320)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1176)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$900(CommandRunnerImpl.java:83)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1235)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1224)
at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:365)
at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:204)
at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:166)
at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:100)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:245)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.jboss.weld.DefinitionException: WELD-000072 Managed bean declaring a passivating scope must be passivation capable. Bean: org.jboss.weld.bean-/D:/Daniel/Estudos/projEstudos/Netbeans/comprovantesSefazPI/build/web/-ManagedBean-class br.gov.pi.sefaz.comprovantes.convenio115.mb.Convenio115MB
at org.jboss.weld.bean.ManagedBean.checkType(ManagedBean.java:351)
at org.jboss.weld.bootstrap.BeanDeployment.doAfterBeanDiscovery(BeanDeployment.java:168)
at org.jboss.weld.bootstrap.BeanDeployment.afterBeanDiscovery(BeanDeployment.java:156)
at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:372)
at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:167)
… 30 more
[/quote]

Minha Classe de Entidade

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.gov.pi.sefaz.comprovantes.convenio115.modelo;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Calendar;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 *
 * @author Nash
 */
@Entity 
@Table(name = "TAB_CONVENIO115_C", catalog = "", schema = "APL_CONV115")
public class TabConvenio115C implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID", nullable = false, length = 15)
    private String id;

    @Column(name = "IE")
    private Long ie;

    @Column(name = "CNPJ", length = 18)
    private String cnpj;

    @Column(name = "RAZAO_SOCIAL", length = 50)
    private String razaoSocial;
    .
    .
    .
    //Restante do código com seus getters e setters.

Minha Classe DAO

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.gov.pi.sefaz.comprovantes.convenio115.dao;

import br.gov.pi.sefaz.comprovantes.convenio115.infra.JPAUtil;
import br.gov.pi.sefaz.comprovantes.convenio115.modelo.TabConvenio115C;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;

/**
 *
 * @author Nash
 */
public class TabConvenio115CDao {


    @SuppressWarnings("unchecked")
    public List<TabConvenio115C> lista(TabConvenio115C convenio115){
        EntityManager em = new JPAUtil().getEntityManager();
        Query query = em.createQuery("From TabConvenio115C c Where c.ie =:pIe and c.chaveReciboEntrega =:pChave");
        query.setParameter("pIe", convenio115.getIe());
        query.setParameter("pChave", convenio115.getChaveReciboEntrega());
        return query.getResultList();
    }

}

Minha Classe Managed Bean

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.gov.pi.sefaz.comprovantes.convenio115.mb;

import br.gov.pi.sefaz.comprovantes.convenio115.dao.TabConvenio115CDao;
import br.gov.pi.sefaz.comprovantes.convenio115.modelo.TabConvenio115C;
import java.util.List;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;

/**
 *
 * @author Nash
 */
@Named
@ConversationScoped
public class Convenio115MB {

    @Inject
    private TabConvenio115CDao dao;

    @Inject
    private TabConvenio115C conv115;

    private List<TabConvenio115C> convenios;

    public String getListagem() {
        if (this.convenios == null) {
            this.convenios = dao.lista(conv115);
        }
        return "index?faces-redirect=true";
    }

    public TabConvenio115C getConv115() {
        return conv115;
    }

    public List<TabConvenio115C> getConvenios() {
        return convenios;
    }

    public void setConv115(TabConvenio115C conv115) {
        this.conv115 = conv115;
    }

    public void setConvenios(List<TabConvenio115C> convenios) {
        this.convenios = convenios;
    }

    
}

Minha página jsf

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:f="http://java.sun.com/jsf/core">
    <f:view contentType="text/html"/>
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form id="formConsulta">
            <p:panel header="Informações">
                <h:panelGrid columns="2">
                    <h:outputText value="Inscrição Estadual"/>
                    <h:inputText value="#{convenio115MB.conv115.ie}"/>

                    <h:outputText value="Chave"/>
                    <h:inputText value="#{convenio115MB.conv115.chaveReciboEntrega}"/>

                    <p:commandButton value="Consultar" action="#{convenio115MB.listagem}">
                        <f:ajax render="@form :formResultado" execute="@form"/>
                    </p:commandButton>

                </h:panelGrid>
            </p:panel>
        </h:form>
        <h:form id="formResultado">
            <p:panel>
                <p:dataTable value="#{convenio115MB.convenios}" var="item" selectionMode="single">
                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Inscricão Estadual"/>
                        </f:facet>
                        <h:outputText value="#{item.ie}"/>
                    </p:column>
                </p:dataTable>
            </p:panel>
        </h:form>
    </h:body>
</html>

E meu persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="comprovantesSefazPIPU" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <non-jta-data-source>JNDI/Conv115</non-jta-data-source>
        <class>br.gov.pi.sefaz.comprovantes.convenio115.modelo.TabConvenio115C</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
            <property name="javax.persistence.jdbc.user" value="apl_conv115"/>
            <property name="javax.persistence.jdbc.password" value="conv115"/>

            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

Do que eu já pesquisei, vi algo com a classe managed bean precisar implementar o serializable mas quando faço isso na anotação @named surge um aviso dizendo que a mesma não suporta esta implementação.

Não sei se entendi correto. Aguardo alguma resposta…

eu me surpreenderia se suportasse, tente

public class Convenio115MB implements Serializable 

Como o weld passiva as coisas no conversation scoped, o seu MB vai ter que implementar Serializable (inclusive as coisas que o MB usam tbm (DAO e modelos)).

Collins, pela mensagem de erro eu acredito que seja alguma coisa com esse escopo de conversação. EU achei isso na documentação do weld:

[quote]6.6.1. Passivation capable beans

A bean is called passivation capable if the container is able to temporarily transfer the state of any idle instance to secondary storage.

* As defined by the EJB specification, all stateful session beans are passivation capable. Stateless and singleton session beans are not passivation capable.
* A managed bean is passivation capable if and only if the bean class is serializable and all interceptors and decorators of the bean are serializable.
* A producer method is passivation capable if and only if it never returns a value which is not passivation capable at runtime. A producer method with a primitive return type or a return type that implements or extends Serializable is passivation capable. A producer method with a return type that is declared final and does not implement Serializable is not passivation capable.
* A producer field is passivation capable if and only if it never refers to a value which is not passivation capable at runtime. A producer field with a primitive type or a type that implements or extends Serializable is passivation capable. A producer field with a type that is declared final and does not implement Serializable is not passivation capable.

A custom implementation of Bean is passivation capable if it implements the interface PassivationCapable. An implementation of Contextual that is not a bean is passivation capable if it implements both PassivationCapable and Serializable.[/quote]

Fonte: http://docs.jboss.org/cdi/spec/1.0/html/contexts.html

Corretíssimo Adriano. Perdi um certo tempo por uma digitação incorreta que eu não percebi antes, mas o problema estava na falta de serialização das classes.

Obrigado a todos pela ajuda.