Я пытаюсь реализовать логин, используя Механизм CDI @javax.enterprise.context.SessionScoped
Войти с КДИ, @Produces возвращает кэшированные значения
Код:
@Named
@SessionScoped
public class Auth implements Serializable {
private User user;
@Inject
private UserStore userStore;
@Produces @CurrentUser
public User getUser() {
if (user == null) {
Principal principal= FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
if (principal != null) {
Map parameters = new HashMap();
parameters.put("email", principal.getName());
user = (User) userStore.findWithNamedQuery(User.GET_BY_EMAIL, parameters).get(0);
}
}
return user;
}
public void logout() throws IOException {
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.invalidateSession();
ec.redirect(ec.getRequestContextPath() + "/");
}
}
Класс, который всегда получает тот же User
экземпляр:
@Stateful
public class NewsService implements Serializable {
@Inject @CurrentUser
private User currentUser;
@Inject
private NewsStore newsStore;
public List<News> getNewsForLoggedUser(Integer start, Integer limit) {
Map<String, Object> params = new HashMap<>();
params.put("user", currentUser);
return (List<News>) newsStore.findWithNamedQuery(News.getAllForUser, params, start, limit);
}
}
проблема есть getUser()
способ. Несмотря на то, что сеанс был признан недействительным, он все равно возвращает значение из первого входа. Как я могу уничтожить компонент CDI или изменить его, чтобы он всегда выводил фактическое значение? Я попытался аннотации logout()
метода с @PreDestroy
, но он производит такую ошибку:
13:20:50,329 ERROR [org.jboss.weld.Bean] (default task-22) WELD-000019 Error destroying an instance Managed Bean [class com.intenso.presentation.Auth] with qualifiers [@Default @Any @Named] of [email protected]
Я бег на WildFly 8.0.0.Alpha4
Ошибка указывает на то, что боб на самом деле в зависимости объема, см '@ default' части? Вы уверены, что используете правильные аннотации? В противном случае проблема может заключаться в том, что вы используете сборку Alpha. – rdcrng
Убедитесь, что вы НЕ используете javax.faces.bean.SessionScoped. –
Я уверен, я разместил его в первой строке моего сообщения вопроса. – Khozzy