Объект @ManagedProperty для данных аутентификации является нулевым - PullRequest
2 голосов
/ 09 ноября 2011

У меня есть следующий управляемый bean-компонент, который сохраняет данные для входа в систему после аутентификации контейнера:

@ManagedBean(name = "authenticatedUserController")
@SessionScoped
public class AuthenticatedUserController implements Serializable {

@EJB
private jpa.UtentiportaleFacade ejbFacade;

  public Utentiportale getAuthenticatedUser() {
    if (AuthenticatedUser == null) {
        Principal principal =   FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
        if (principal != null) {
            AuthenticatedUser = ejbFacade.findByLogin(principal.getName()).get(0);
        }
    }
    return AuthenticatedUser;
}

getAuthenticatedUser вызывается на каждой странице, потому что я поместил имя пользователя в шаблоне facelets вверху справа.В PermessimerceController, другом управляемом объекте, мне нужно получить доступ к данным для входа, чтобы легко и быстро ввести вышеуказанный контроллер области действия:

@ManagedProperty(value = "#{authenticatedUserController}")
private AuthenticatedUserController authenticatedUserController;

У меня возникла следующая проблема: попытка получить доступ к странице, которая связана сPermessimerceController без проверки подлинности я перенаправлен на страницу входа (и это нормально), но после этого я получаю исключение нулевого указателя, поскольку authenticatedUserController имеет значение null, когда он вводится внутри PermessimerceController.На рассматриваемой странице используются как PermessimerceController, так и AuthenticatedUserController, поэтому я должен предположить, что по какой-то причине PermessimerceController создается до AuthenticatedUserController.Можете ли вы предложить простой способ решения этой проблемы?В качестве альтернативы, как я могу хранить данные для входа в легкодоступном месте?

Спасибо, Филиппо

Я пытаюсь отредактировать этот пост в надежде лучше прояснить проблему и найти полезные ответы.Используя шаблоны лицевой стороны, я показываю имя пользователя для входа через свойство AuthenticatedUserController.Остальная часть контента связана с PermessimerceController, который нуждается в некоторой информации о пользователе для фильтрации данных.Аннотация @ManagedBean - это простой способ сделать это.К сожалению, если пользователь получает доступ к этой странице без аутентификации, внедренный AuthenticatedUserController имеет значение null.Так что, кажется, PermessimerceController создан до AuthenticatedUserController, и мне интересно, почему.Есть ли уловка, которую я могу использовать, чтобы быть уверенным, что AuthenticatedUserController создается раньше?

1 Ответ

2 голосов
/ 09 ноября 2011

Вы, очевидно, обращались к нему в конструкторе бина:

@ManagedProperty("#{authenticatedUserController}")
private AuthenticatedUserController authenticatedUserController;

public PermessimerceController() {
    authenticatedUserController.getAuthenticatedUser(); // Fail!
}

Это действительно не будет работать таким образом. Компонент bean создается за до внедрения зависимостей (подумайте об этом; как еще менеджер внедрения зависимостей может внедрить его?)

Самая ранняя точка доступа - это метод @PostConstruct:

@ManagedProperty("#{authenticatedUserController}")
private AuthenticatedUserController authenticatedUserController;

@PostConstruct
public void init() {
    authenticatedUserController.getAuthenticatedUser(); // Success!
}
...