2016-05-13 31 views
14

Tôi đã phiên sau scoped đậu:Không thể deserialize mùa xuân phiên scoped đậu

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

và tôi lưu trữ phiên tomcat trong một cơ sở dữ liệu. Vấn đề là, khi ứng dụng cố gắng deserialize một phiên lưu trữ, tôi nhận được lỗi sau:

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

Dường như nó đăng thực sự bối cảnh toàn bộ mùa xuân, và rõ ràng là không có lớp như de.myproject.SessionData$$EnhancerBySpringCGLIB$$768b59b9 sau khi khởi động lại máy chủ , vì vậy tôi nhận được ngoại lệ nói trên.

Có cách nào để tránh điều này, sao cho đậu phiên được sắp xếp đúng cách?

CẬP NHẬT: Có một số issue liên quan đến điều này được đánh dấu là đã giải quyết mà không có nhận xét, tuy nhiên tôi vẫn phải đối mặt với nó.

+0

Làm thế nào để bạn lưu trữ dữ liệu phiên trong DB của bạn? –

+0

Tôi có máy chủ Tomcat được định cấu hình để lưu trữ các phiên trong DB. – vtor

+0

Bối rối: @ManagedBean là chú thích JSF, tại sao bạn có cả chú thích JSF và Spring trên một bean đơn? –

Trả lời

0

Có một bean có phiên phạm vi không có nghĩa là bean có thể được tuần tự hóa và có thể lưu trữ trong phiên.

Như bạn có thể đoán từ tên của lớp, lớp proxy được tạo ra khi chạy với tên khác tại mỗi lần khởi động. Điều này giải thích tại sao một vấn đề xảy ra tại deserialization.

Tôi đoán bạn cố gắng thêm SessionData này làm thuộc tính của phiên web. Bạn không nên. Lưu trữ dữ liệu POJO của bạn trong phiên web mà không cần sử dụng hạt cà phê.

Nếu bạn sử dụng bean để chèn các kết nối cơ sở dữ liệu hoặc các đối tượng tương tự, hãy quên nó. Bạn chỉ có thể sử dụng đậu phạm vi phiên cho các bối cảnh cụ thể mà không phải là yêu cầu của bạn.

+1

Đây là hạt JSF, và JSF tự động sắp xếp tất cả các phiên hạt tạp và lưu trữ chúng trong phiên. – vtor

1

Hãy có một thử:

sử dụng: import org.springframework.test.util.AopTestUtils;

Serializable readyToSerialize = AopTestUtils.getUltimateTargetObject(yourInstance); 

trước serialize nó.

Lưu ý: mã này hữu ích để giải quyết vấn đề, nếu công việc này, bạn phải phân tích kiến ​​trúc dự án và phụ thuộc, để thực hiện tốt hơn cho mã sản xuất. Trước hết, tại sao bạn cần phải tuần tự hóa ScopedProxyMode.TARGET_CLASS

0

Tôi không biết rõ nhiệm vụ của bạn, nhưng theo ý kiến ​​của tôi, đối tượng dữ liệu như thế này không phải là bean mùa xuân vì đậu mùa xuân nên là logic nghiệp vụ, bộ điều khiển đậu và như vậy và không phiên dto.

vì lý do này, tôi nên cố gắng suy nghĩ tại sao bạn muốn lưu trữ dữ liệu của bean mùa xuân và cố gắng giải mã dữ liệu bạn muốn trong phiên http, @sessionattribute của springmvc, từ bean logic nghiệp vụ shoud cũng không được nhận biết phiên.

i hooe rằng đây có thể giúp bạn thay đổi stategy thực hiện của bạn để tìm ra các giải pháp của vấn đề của bạn

Các vấn đề liên quan