Nie jestem pewien, czy to, co robię, jest błędne, czy też właśnie pominięto adnotację lub element konfiguracji. Oto sytuacja:JSF - Komponent bean o ograniczonym zakresie sesji nie ma ponownie wziętych zależności w przypadku deserializacji sesji
Mam aplikację JSF z ziarnem o zakresie sesji o nazwie SessionData
. Ten komponent bean ma odwołanie do komponentu bean o zasięgu aplikacji (typu ApplicationData
), które zostało wstrzyknięte do niego podczas tworzenia. Działa to dobrze, gdy sesja jest tworzona po raz pierwszy. Zastrzyk zależność odbywa się <managed-bean>
elementów w pliku faces-config.xml
jak pokazano tutaj:
<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>
Bo to nie ma sensu mieć mój SessionData
obiekt to obiekt ApplicationData
kiedy to w odcinkach, mam zaznaczone odwołanie ApplicationData
jako przejściowy w moim SessionData
obiektu:
transient private ApplicationData applicationData;
Wszystko jest dobrze dopóki aplikacja internetowa jest zatrzymany (w moim 6.x kontenera Tomcat) i sesje są w odcinkach. Gdy ponownie uruchomię aplikację i sesje zostaną deserialized, moje odniesienie do ApplicationData
nie zostanie ponownie wstrzyknięte przez JSF. Wiem, że deserializacja ma pozostawiać pola przejściowe bez wartości. Czy istnieje sposób sygnalizowania JSF, że obiekt o zakresie sesji wymaga, aby jego zależności zostały ustawione ponownie po deserializacji?
Używam MyFaces JSF 1.2 i Tomcat 6.0.26 jako mojego kontenera aplikacji WWW.
Zasugerowano, że dostarczam metodę readObject() i ręcznie ustawiam obiekt ApplicationData podczas deserializacji za pomocą FaceContext. Nie sądzę, że to zadziała, ponieważ FaceContext jest dostępny tylko w czasie trwania żądania. Deserializacja ma miejsce podczas uruchamiania aplikacji. –
poprawne, dlatego usunąłem odpowiedź. Wydaje się być bardziej skomplikowany (stąd +1 dla pytania). – Bozho