@SessionScoped public class User {
... //settings, attributes, etc
}
@ViewScoped public class FooController {
@ManagedProperty(value="#{user}")
private User user;
...
}
@RequestScoped public class LoginController {
@ManagedProperty(value="#{user}")
private User user;
public String login() {
//handle Servlet 3.0 based authenticate()... if success, make new User object and slap it into context
request.getSession().setAttribute("user", user);
return "?faces-redirect=true";
}
...
}
xhtml страницы включают элементы управления доступом практически на каждой странице. Идеальным было бы то, что они могут войти в систему, и страница обновится, а существующий FooController
будет иметь ссылку на текущего пользователя, который условно отображает кнопки/элементы. Поведение заключается в том, что логин происходит, но вид FooController
по-прежнему «действителен», поэтому управляемый компонент никогда не пытается быть введенным повторно. Если я перейду со страницы и вернусь на нее [восстановление объекта с расширенным представлением], пользовательский компонент будет хорошо преобразован ... но я бы предпочел не иметь этот промежуточный шаг. Есть идеи?Обновить вид вложенных компонентов JSF beans вставляется в фасоль
Я пробовал различные формы FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove("user");
в надежде, что он перетянет его с сеанса, но безрезультатно. Я не хочу тесно связывать код в моем LoginController, чтобы ссылаться на конкретную недействительность FooController или BarController или любого другого, который ссылается на пользовательский компонент.
Ну, цель состоит не столько в том, чтобы удалить пользовательский компонент, а в том, чтобы размножать обновленный объект User на любой bean. Я протестировал ваше решение, которое работает, но 'FooController' является лишь одним из примерно 20 видов видимых бобов, которые могут быть живы в зависимости от того, на какой странице пользователь входит. [Форма входа - панель всплывающих окон, включенная почти на каждую страницу]. Казалось бы, проблема с запутанностью заключается в том, чтобы использовать кодовое имя 'LoginController '20+ beans для удаления. – Eric