Управляемое свойство SessionScope внутри объекта ViewScoped - Transient?
У меня есть структура JSF Beans такого рода:
@ManagedBean
@ViewScoped
public class ViewBeany implements Serializable {
....
@ManagedProperty(value='#{sessionBeany})
transient private SessionBeany sessionBeany;
...
public getSessionBeany() { ... };
public setSessionBeany(SessionBeany sessionBeany) { ... };
}
Причина для transient
заключается в том, что сессионный компонент имеет некоторые не сериализуемые члены и не может быть сделан сериализуемым.
Будет ли это работать?
Если нет, как я могу решить проблему невозможности сериализации SesionBeany
но нужно ли держать его как управляемое свойство в объекте видимости?
Спасибо!
1 ответ
Это не сработает. Если bean-объект области видимости сериализован, все transient
поля пропущены. JSF не повторно внедряет управляемые свойства после десериализации, поэтому вы получите bean-объект области видимости без свойства bean-объекта области видимости, которое вызовет только NPE.
В этой конкретной конструкции вам лучше всего ввести ленивую загрузку в получателе и получить сессионный компонент получателем вместо прямого доступа к полю.
private transient SessionBeany sessionBeany;
public SessionBeany getSessionBeany() { // Method can be private.
if (sessionBeany == null) {
FacesContext context = FacesContext.getCurrentInstance();
sessionBeany = context.getApplication().evaluateExpressionGet(context, "#{sessionBeany}", SessionBeany.class);
}
return sessionBeany;
}