2010-05-02 21 views
0

在客戶端狀態保存和序列化的JSF2中我有問題。我創建了一個完整的描述和一個小班級圖表:http://tinyurl.com/jsf2serial。爲了客戶端狀態節省,我必須在類別Search,BackingBeanConnection上實施Serializable。引發的例外是:在客戶端狀態保存和序列化的JSF2中的問題

java.io.NotSerializableException: org.apache.commons.httpclient.HttpClient 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156) 
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) 
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) 
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) 
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) 
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) 
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) 
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) 
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) 
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) 
at java.util.HashMap.writeObject(HashMap.java:1001) 
at sun.reflect.GeneratedMethodAccessor80.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) 
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461) 
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) 
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) 
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) 
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) 
at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) 
at java.util.HashMap.writeObject(HashMap.java:1001) 
at sun.reflect.GeneratedMethodAccessor80.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) 
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461) 
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) 
at com.sun.faces.renderkit.ClientSideStateHelper.doWriteState(ClientSideStateHelper.java:293) 
at com.sun.faces.renderkit.ClientSideStateHelper.writeState(ClientSideStateHelper.java:167) 
at com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:123) 
at com.sun.faces.application.StateManagerImpl.writeState(StateManagerImpl.java:155) 
at com.sun.faces.application.view.WriteBehindStateWriter.flushToWriter(WriteBehindStateWriter.java:221) 
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:397) 
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126) 
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
at java.lang.Thread.run(Thread.java:637) 

也許這是我的設計問題,因爲我是開發Java webapps的新手。

回答

1

這個例外基本上告訴你不能(不應該)不要在HttpSession中存儲HttpClient。顯然你已經將它作爲某個會話作用域bean的屬性。你不應該那樣做。要麼聲明它transient或保留它threadlocal(即只聲明和使用它在本地方法塊,以便您可以擺脫屬性)。後一種方法有我的建議,因爲HttpClient保持一些內部狀態,這可能會導致您的應用程序在全部反序列化時中斷。如果您希望有一個長壽的實例,因爲重新創建它很昂貴,那麼我建議將它存儲在應用程序範圍的bean中。

+0

謝謝,我嘗試瞬態......但如果你看看你看到的類圖,那連接是應用程序作用域...和具有屬性的bean是視圖作用域... – marcel 2010-05-02 15:04:50

+0

我沒有仔細看圖,實際上整個圖像沒有出現。但是將連接存儲在應用程序範圍中是一個壞主意。你不能指望只要你的應用程序存在,連接就會生存。它會遲早超時,你的應用程序可能會中斷。 – BalusC 2010-05-02 15:16:35

+0

hm ...我喜歡在applecation範圍內的連接中存儲...所有用戶都應該使用相同的連接,並在應用程序啓動時連接應該開始... – marcel 2010-05-02 15:19:12