具有 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?