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

时间:2013-03-20 15:06:33

标签: jsf-2 java-ee-6 cdi ejb-3.1

我正在尝试创建可伸缩的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。

我该怎么办?

我知道我可以使用带有Seam Faces或CODI的CDI ViewScoped,但我想最大限度地减少依赖。

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

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

1 个答案:

答案 0 :(得分:0)

我不喜欢自己回答我自己的问题,但经过一些研究后我发现这是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目录中。