Tôi không chắc chắn nếu những gì tôi đang làm là sai, hoặc nếu tôi chỉ bỏ lỡ một chú thích hoặc mục cấu hình ở đâu đó. Đây là tình huống:JSF - Bean được quản lý theo phiên không có phụ thuộc được tiêm lại trên phiên deserialization
Tôi có một ứng dụng JSF với một bean phiên có phạm vi tên là SessionData
. Bean này có một tham chiếu bean có phạm vi ứng dụng (loại ApplicationData
) được chèn vào nó vào lúc tạo. Điều này hoạt động tốt khi phiên được tạo lần đầu tiên. Các dependency injection được thực hiện với <managed-bean>
yếu tố trong file faces-config.xml
như ở đây:
<managed-bean>
<managed-bean-name>sessionData</managed-bean-name>
<managed-bean-class>my.package.SessionData</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>applicationData</property-name>
<property-class>my.package.ApplicationData</property-class>
<value>#{applicationData}</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>applicationData</managed-bean-name>
<managed-bean-class>my.package.ApplicationData</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
Bởi vì nó không có ý nghĩa để có đối tượng SessionData
tôi bao gồm các đối tượng ApplicationData
khi nó đăng, tôi đã đánh dấu sự ApplicationData
tài liệu tham khảo như thoáng qua trong đối tượng SessionData
tôi:
transient private ApplicationData applicationData;
Tất cả là tốt cho đến khi ứng dụng web được dừng lại (trong container 6.x Tomcat của tôi) và các buổi là serialized. Khi tôi khởi động lại ứng dụng và các phiên được deserialized, tham chiếu của tôi để ApplicationData
không được tiêm lại bởi JSF. Tôi biết rằng deserialization là vụ phải rời khỏi các lĩnh vực thoáng qua mà không có một giá trị. Có cách nào để báo hiệu JSF rằng đối tượng có phạm vi phiên này yêu cầu các phụ thuộc của nó được đặt lại sau khi deserialization không?
Tôi đang sử dụng MyFaces JSF 1.2 và Tomcat 6.0.26 làm vùng chứa ứng dụng web của mình.
Tôi đã gợi ý rằng tôi cung cấp phương thức readObject() và đặt thủ công đối tượng ApplicationData trong đó trong quá trình deserialization bằng cách sử dụng FacesContext. Tôi không nghĩ rằng sẽ làm việc kể từ khi FacesContext chỉ có sẵn trong suốt tuổi thọ của một yêu cầu. Việc deserialization đang xảy ra lúc khởi động ứng dụng. –
đúng, đó là lý do tôi xóa câu trả lời của mình. Nó xuất hiện phức tạp hơn (do đó +1 cho câu hỏi) – Bozho