Jsf 2 具有CDI注入属性的ViewScope ManagedBean上的NotSerializableException
我正在尝试创建一个可伸缩的JSF应用程序。 我想在客户端保存视图状态,但我对带有CDI注入属性的ViewScope ManagedBean有问题 SomeService.java:Jsf 2 具有CDI注入属性的ViewScope ManagedBean上的NotSerializableException,jsf-2,java-ee-6,cdi,ejb-3.1,Jsf 2,Java Ee 6,Cdi,Ejb 3.1,我正在尝试创建一个可伸缩的JSF应用程序。 我想在客户端保存视图状态,但我对带有CDI注入属性的ViewScope ManagedBean有问题 SomeService.java: @Singleton public class SomeService { // ... } SomeBean.java @ManagedBean @ViewScoped public class SomeBean implements Serializable { @Inject
@Singleton
public class SomeService {
// ...
}
SomeBean.java
@ManagedBean
@ViewScoped
public class SomeBean implements Serializable {
@Inject
private SomeService someService;
}
不幸的是,glassfish未能序列化someService
,我不想序列化它,而是重新注入它
我试图使其暂时化,在反序列化后访问someService
时,最终导致NullPointerException
我该怎么办
我知道我可以将CDI ViewScope与Seam Faces或CODI一起使用,但我希望最大限度地减少依赖性
我也可以等待JEE7,它将为CDI提供@ViewScope,但我们在几个月前不会使用JEE7
更新:我只是想补充一点,我使用的是捆绑在一个jar中的嵌入式EJB,这个jar本身就链接到我的war。 NotSerializableException的堆栈跟踪包含以下消息:
com.company.core.service.\uuuuejb31\uuuuuuuuuusomeservice\uuuuuuu Intf\uuuuuuuuuuuuuuuuuu Bean\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
我不喜欢自己回答自己的问题,但经过进一步研究后,我发现这是Mojarra 2.1.6中的一个bug(我使用的Glassfish 3.1.2.2.2
要更新Mojara,您只需要下载一个更新的版本(例如:)并将其作为javax.faces.jar放在$GLASSFISH/modules目录中。为什么您要通过CDI的
@Inject
而不是EJB的@EJB
来注入EJB?我并没有真正的区别,因为在某些情况下使用@EJB
更好。我试图从@Inject
更改为@EJB
,但没有任何改进。你有什么建议吗?