Управляемое свойство 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;
}
Другие вопросы по тегам