具有 CDI 注入属性的 ViewScoped ManagedBean 上的 NotSerializableException

Posted

技术标签:

【中文标题】具有 CDI 注入属性的 ViewScoped ManagedBean 上的 NotSerializableException【英文标题】:NotSerializableException on ViewScoped ManagedBean with CDI Injected properties 【发布时间】:2013-03-09 18:28:55 【问题描述】:

我正在尝试创建一个可扩展的 JSF 应用程序。 我想在客户端保存视图状态,但我在使用带有 CDI 注入属性的 ViewScoped ManagedBean 时遇到问题。

SomeService.java :

@Singleton
public class SomeService 
    // ...

SomeBean.java

@ManagedBean
@ViewScoped
public class SomeBean implements Serializable 

            @Inject
            private SomeService someService;

不幸的是 glassfish 无法序列化 someService 我不想被序列化但重新注入。

在反序列化后访问someService 时,我尝试使其变为瞬态,最终导致 NullPointerException。

我该怎么办?

我知道我可以将 CDI ViewScoped 与 Seam Faces 或 CODI 一起使用,但我想最大限度地减少依赖关系。

我也可以等待 JEE7,它将为 CDI 提供 @ViewScoped,但我们不会在几个月前使用 JEE7。

更新: 我只是想补充一点,我正在使用捆绑在一个 jar 中的嵌入式 EJB,该 jar 本身与我的战争相关联。 NotSerializableException 的堆栈跟踪具有以下消息: com.company.core.service.__EJB31_Generated__SomeService__Intf____Bean__

【问题讨论】:

为什么要通过 CDI 的 @Inject 而不是 EJB 的 @EJB 注入 EJB? 我并没有真正得到区别,根据link,在某些情况下最好使用@EJB。我试图从@Inject 更改为@EJB 没有任何改进。你有什么建议吗? 【参考方案1】:

我不喜欢自己回答自己的问题,但经过更多研究后,我发现这是 Mojarra 2.1.6 中的一个错误(我使用的是 Glassfish 3.1.2.2),现在在 Mojarra 2.1 中已解决。 20.

要更新 Mojarra,您只需下载更新版本(例如:https://maven.java.net/content/repositories/releases/org/glassfish/javax.faces/2.1.20/javax.faces-2.1.20.jar)并将其作为 javax.faces.jar 放在 $GLASSFISH/modules 目录中。

【讨论】:

以上是关于具有 CDI 注入属性的 ViewScoped ManagedBean 上的 NotSerializableException的主要内容,如果未能解决你的问题,请参考以下文章

为什么GlassFish 5.1.0中的JSF将我的@ViewScoped CDI bean的ID属性设置为null?

CDI:由于多重继承和泛型抽象导致的属性注入问题

启用 CDI 注入到由生产者方法创建的 bean

多个浏览器选项卡上的 ViewScoped bean 冲突

JSF 2.x @ViewScoped 托管 bean 线程安全吗?

如何检测和删除(在会话期间)不能被垃圾收集的未使用的 @ViewScoped bean