【问题标题】:WELD-000072 Managed bean declaring a passivating scope must be passivation capableWELD-000072 声明钝化范围的托管 bean 必须具有钝化能力
【发布时间】:2012-04-03 08:44:22
【问题描述】:

我在 java web 表单中编写了一个简单的程序,但收到以下错误:

WELD-000072 声明钝化范围的托管 bean 必须具有钝化能力。 Bean:托管 Bean [class BeanPakage.DemoBeans] 带限定符 [@Any @Default @Named]

谁能告诉我这个错误来自哪里?

import javax.enterprise.context.SessionScoped;
import javax.inject.Named;


@Named("DemoBeans")
@SessionScoped
public class DemoBeans {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

【问题讨论】:

    标签: java cdi jboss-weld


    【解决方案1】:

    您可以通过实现 Serializable 接口使您的 bean 能够钝化:

    public class DemoBean implements Serializable { ... }
    

    请注意,对钝化能力有更多要求。有关详细信息,请参阅焊接文档。

    【讨论】:

    • 感谢您的解决方案。
    • 多么神秘的错误信息!
    【解决方案2】:

    即使 CDI bean 是可序列化的,错误可能仍然存在:

    WELD-000072 Managed bean declaring a passivating scope must be passivation capable
    

    示例类:

    @Named
    @ConversationScoped
    public class TransactionMatchController implements Serializable {
        ...
    }
    

    确保所有 @Interceptors 也是可序列化的:

    @Interceptor
    @Transactional
    public class TransactionInterceptor implements Serializable {
        ...
    }
    

    【讨论】:

    • 谢谢,可序列化的@Interceptors 是我的问题!
    【解决方案3】:

    它必须是可序列化的。

    查看这个答案。

    https://community.jboss.org/thread/179828

    最好, 安德斯

    【讨论】:

      【解决方案4】:

      使DemoBeans序列化

      @Named("DemoBeans")
      @SessionScoped
      public class DemoBeans  implements Serializable
      {
      
          private String name;
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
      }
      

      【讨论】:

        【解决方案5】:

        您还可以使用注释激活 bean 的钝化行为:

        @Stateful(passivationCapable=true)

        在这种情况下,您不需要实现 Serializable 接口。

        问候。 豪尔赫

        【讨论】:

          【解决方案6】:

          验证导入

          (有时 netbeans 使用其他库中的其他内容)

          示例。导入 javax.faces.view.ViewScoped;通过 import javax.faces.bean.ViewScoped 改变它;

          【讨论】:

          • 实际上 JSF 2.3 弃用了 javax.faces.bean.ViewScoped 以支持 javax.faces.view.ViewScoped。这是否意味着我必须遍历所有视图范围的 bean 并使它们可序列化?来自javax.faces.bean.ViewScopedjavadoc:@deprecated This has been replaced by {@code javax.faces.view.ViewScoped}. The functionality of this corresponding annotation is identical to this one, but it is implemented as a CDI custom scope.
          【解决方案7】:

          原因:org.jboss.weld.exceptions.DeploymentException:WELD-000072:声明钝化范围的 Bean 必须具有钝化能力。 Bean:带有限定符 [@Default @Named @Any] 的托管 Bean [class com.marcos.controller.PersonaBean]


          我解决了,显然是CDI,我没有识别bean,我只是让它更明确

          @Named
          @ViewScoped
          public class PersonaBean  implements Serializable {
          @Inject
          private IPersonaService service;
          public void registrar() {
          
              try {
                  service.registrar(null);
          
              }catch (Exception e) {
                  e.printStackTrace();
              }
            }
          }
          

          我的解决方案:

          @Named ("PersonaBean")
          @ViewScoped
          public class PersonaBean  implements Serializable {
          @Inject
          private IPersonaService service;
          public void registrar() {
          
              try {
                  service.registrar(null);
          
              }catch (Exception e) {
                  e.printStackTrace();
              }
            }
          }
          

          【讨论】:

            猜你喜欢
            • 2021-03-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-17
            • 2015-05-15
            相关资源
            最近更新 更多