簡體   English   中英

無法反序列化Spring Session Scoped bean

[英]Unable to deserialize Spring Session Scoped bean

我有以下會話作用域bean:

@ManagedBean
@Component
@Scope(proxyMode= ScopedProxyMode.TARGET_CLASS, value="session")
public class SessionData implements Serializable {}

我將tomcat會話存儲在數據庫中。 問題是,當應用程序嘗試反序列化存儲的會話時,我收到以下錯誤:

 org.apache.catalina.session.PersistentManagerBase.swapIn Error deserializing Session EE913D2ACAD49EB55EDA657A54DFA2CB: {1}
 java.lang.ClassNotFoundException: de.myproject.SessionData$$EnhancerBySpringCGLIB$$768b59b9

看來它實際上序列化了整個Spring上下文,顯然在服務器重啟后沒有這樣的類de.myproject.SessionData$$EnhancerBySpringCGLIB$$768b59b9 ,所以我收到了上述異常。

有沒有辦法避免這種情況,以便會話范圍的bean正確序列化?

更新:有一個問題關於這個標記為沒有評論的解決,但我仍然面對它。

請試一試:

using: import org.springframework.test.util.AopTestUtils;

 Serializable readyToSerialize = AopTestUtils.getUltimateTargetObject(yourInstance);

在序列化之前。

注意:此代碼可用於解決問題,如果這項工作,您必須分析項目體系結構和依賴性,以更好地完成生產代碼。 首先,為什么需要序列化ScopedProxyMode.TARGET_CLASS

使用具有范圍會話的bean並不意味着該bean可序列化並且可以存儲在會話中。

正如你可以從類的名稱猜測的那樣,在運行時生成一個代理類,每次啟動時都有一個不同的名稱。 這解釋了為什么在反序列化時出現問題。

我猜你試圖將此SessionData添加為Web會話的屬性。 你不應該。 將POJO數據存儲在Web會話中,而不使用bean。

如果您使用bean注入數據庫連接或類似對象,請忘記它。 您可以將會話范圍bean用於特定的上下文,這些上下文不符合我的要求。

我不太清楚你的任務,但在我看來,像這樣的數據對象不應該是一個spring bean,因為spring bean應該是業務邏輯bean,控制器bean等等而不是session dto。

出於這個原因,我認為你應該試着想一想你為什么要存儲你的spring bean的數據,並嘗試在業務邏輯bean中shoud也不是session會話,在http會話,@sessionattribute of springmvc中,你想要的數據。知道的。

我知道這可以幫助您改變實施狀態,以便找到問題的解決方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM