WELD-000072 声明钝化范围的托管 bean 必须具有钝化能力

Posted

技术标签:

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

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

。 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;
    

【问题讨论】:

【参考方案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();
    
  

【讨论】:

以上是关于WELD-000072 声明钝化范围的托管 bean 必须具有钝化能力的主要内容,如果未能解决你的问题,请参考以下文章

Session的活化和钝化,表单重复提交,验证码使用流程

session的活化与钝化 (转)

JavaWeb Listener之HttpSessionActivationListener ,session钝化活化

JavaWeb---session活化与钝化

OpenCV 完整例程62. 图像锐化——钝化掩蔽

如何从 C# 等托管代码中为 ActiveX 组件使用嵌入式免注册清单?