Jsf @ViewScoped中的Binding属性导致远程EJB抛出java.io.NotSerializableException

Jsf @ViewScoped中的Binding属性导致远程EJB抛出java.io.NotSerializableException,jsf,ejb,serializable,view-scope,Jsf,Ejb,Serializable,View Scope,当我向远程EJB发送一个未实现Serializable的类对象时,它会处理它,但当这个类的一个字段是绑定中使用的属性时,情况会发生变化,该属性来自@ViewScoped支持bean。在第二种情况下,抛出java.io.NotSerializableException 表格 支持bean @Named(value=“bean”) @视域 公共类Bean实现了可序列化{ @EJB 专用远程ejbservice服务; 私有NotSerializableClass notSerializableOb

当我向远程EJB发送一个未实现
Serializable
的类对象时,它会处理它,但当这个类的一个字段是
绑定中使用的
属性时,情况会发生变化,该属性来自
@ViewScoped
支持bean。在第二种情况下,抛出
java.io.NotSerializableException

表格


支持bean

@Named(value=“bean”)
@视域
公共类Bean实现了可序列化{
@EJB
专用远程ejbservice服务;
私有NotSerializableClass notSerializableObj;
公共NotSerializableClass getNotSerializableObj(){
返回notSerializableObj;
}
public void setNotSerializableObj(NotSerializableClass notSerializableObj){
this.notserializablebj=notserializablebj;
}
@施工后
私有void init(){
面板p=新面板();
System.out.println(“初始面板:”+p);
notSerializableObj=新的NotSerializableClass(“myObject”,p);
}
公共void sendToEjb(){
System.out.println(“发送到EJB”);
trySending();
System.out.println(“使用新对象进行第二次尝试”);
面板p=新面板();
notSerializableObj.setPfPanel(p);
trySending();
}
私人无效试用结束(){
试一试{
System.out.println(“Panel:+notSerializableObj.getPfPanel());
notSerializableTest(notSerializableObj);
System.out.println(“正确发送”);
}捕获(例外e){
System.out.println(“异常:+e”);
}
}
}
NotSerializableClass

公共类NotSerializableClass{
私有字符串someString;
私有面板pfPanel;//PrimeFaces面板未实现可序列化
public NotSerializableClass(字符串someString,面板pfPanel){
this.someString=someString;
this.pfPanel=pfPanel;
}
//吸气剂二传手
}
结果

Info:INIT Panel:org.primefaces.component.Panel。Panel@9f68a9
信息:发送到EJB
信息:Panel:org.primefaces.component.Panel。Panel@9f68a9
信息:Exception:javax.ejb.EJBException:java.rmi.marshallexception:CORBA坏参数1398079494可能;嵌套异常是:
java.io.NotSerializableException:警告:00100006:类测试。NotSerializableClass不可序列化
信息:第二次尝试新对象
信息:Panel:org.primefaces.component.Panel。Panel@e59fd7
信息:发送正确
在抛出第一个try异常时,第二个try对象成功发送,尽管未实现
Serializable
。当我删除
binding
属性时,在第一个
trySending()
中没有引发任何异常

如果我将
javax.faces.STATE\u SAVING\u METHOD
设置为
server
client
,则没有区别。但如果bean是
@RequestScoped
@SessionScoped
的,或者远程接口被替换为本地接口,那么它就可以工作

问题是:当对象连接到
绑定
属性时,对象会发生什么变化,因为EJB之后无法处理它

创建后未序列化面板,因为
@PostConstruct
中的hashcode和提交方法相同

全堆栈跟踪

Severe:javax.ejb.EJBException:java.rmi.marshallexception:CORBA坏参数1398079494可能;嵌套异常是:
java.io.NotSerializableException:警告:00100006:类测试。NotSerializableClass不可序列化
位于mot.services.\u RemoteEjbService\u Wrapper.notSerializableTest(mot/services/\u RemoteEjbService\u Wrapper.java)
在test.MyBean.trySending(MyBean.java:104)中
位于test.MyBean.sendToEjb(MyBean.java:92)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:497)
位于com.sun.el.parser.AstValue.invoke(AstValue.java:289)
位于com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
位于org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
位于org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
在com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)上
位于javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
位于com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
在javax.faces.component.UICommand.broadcast(UICommand.java:315)
位于javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
位于javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
位于com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
位于com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
在com.sun.faces.lifecycle.LifecycleImpl.execute上(LifecycleImpl.java:198)
位于javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
位于org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
在test.CountingFilter.doFilter(CountingFilter.java:35)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
位于org.apache.catalina.core.Stan