@ManagedProperty не отражает изменения и продолжает возвращать ноль
Я пытаюсь ввести значение одного сессионного компонента в bean-объект с видимостью, но он продолжает возвращать ноль, вот фрагмент:
import javax.faces.application.FacesMessage;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
//Class for managing the current logged-in user
@ManagedBean(name="user")
@SessionScoped
public class User implements Serializable{
private String userName;
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserName() {
return this.userName;
}
И это используется в:
@ManagedBean(name="databrowser")
@ViewScoped
public class dataBrowser implements Serializable {
private List<UploadData> dataItems;
private SelectItem[] dataTypeOptions, qualityOptions, accessOptions;
private UploadData selectedData;
private String filelocation;
@ManagedProperty(value="#{user.userName}")
private String userName;
public String getUserName() {
return this.userName;
}
dataBrowser используется для заполнения таблицы данных Primefaces, когда он называется userName и имеет значение null, и я не уверен, почему.
5 ответов
Недавно у меня возникла проблема с внедрением вложенных свойств управляемого компонента @ManagedProperties
тоже. Однажды введенный это никогда не изменилось. Я сделал обходной путь, оценивая EL в геттере, а не вводя его.
Попробуй это:
public String getUserName() {
FacesContext context = FacesContext.getCurrentInstance();
return (String) context.getApplication().evaluateExpressionGet(context,"#{user.userName}", String.class);
}
Вы также можете попробовать ввести все user
боб и получить userName
поле из него в геттер.
Я только что столкнулся с той же проблемой, и случайно обнаружил, что она не работает, если я пытаюсь с Firefox (на самом деле icedove под Linux), но хорошо работает, если я пытаюсь использовать встроенный браузер eclipse.
Несмотря на это, это не имеет смысла для меня, вы уже пробовали с другими браузерами?
Ответ michal777 очень хорошо работает. Я расширил это до этого:
@ManagedProperty("#{nameBean}")
private NameBean nameBean;
public NameBean getNameBean() { return nameBean; }
public void setNameBean(NameBean nameBean) { this.nameBean = nameBean; }
public NameBean getNameBean_Workaround() {
FacesContext context = FacesContext.getCurrentInstance();
return (NameBean) context.getApplication().evaluateExpressionGet(context,"#{nameBean}", NameBean.class);
}
и позже:
if (nameBean != null) {
nameBean.setName("achsooo");
}
else {
getNameBean_Workaround().setName("achsooo2222");
}
Теперь в браузере Eclipse устанавливается "achsooo", а в icedove "achsooo2222" устанавливается.
#{user.userName}
интерпретируется JSF как getUser().getUserName()
Так что лучше иметь @ManagedProperty
типа User
, с его методами получения / установки getUser
/setUser
, С этим вы можете получить доступ к имени пользователя по #{user.userName}
,
У меня была эта проблема, и проблема была на самом деле двоякой. (Обратите также внимание, что @ManagedProperty будет работать только в классе @ManagedBean, и если этот класс @ManagedProperty имеет ту же или меньшую область действия (приложение, сеанс, представление, запрос и т. Д.).) Вот как я это исправил:
Проблема 1: JSF глуп и не справляется @ManagedProperty
впрыск правильно в abstract
классы.
Решение:
- Сделайте каждый класс, который использует
@ManagedProperty
быть аннотированным@ManagedBean
, - Сделать каждый
abstract
класс, который использует свойство, не будет аннотировано@ManagedProperty
и вместо этого предоставляют только абстрактные методы получения и установки, которые каждый неабстрактный класс будет переопределять. - Использовать
abstract
метод получения класса вместо самого @ManagedProperty вabstract
классы.
Проблема 2: JSF глуп и не справляется @ManagedProperty
правильное внедрение в классы @ManagedBean, не созданные JSF (т.е. вы сами создаете эти классы, используя new
).
Варианты решения:
- Пусть JSF создаст класс, который использует
@ManagedProperty
, - Используйте следующий код:
MyClass example = Utils.getELValue("EL Expression Goes Here", MyClass.class);
public static <T> T getELValue(final String elName, final Class<T> clazz) {
FacesContext fc = FacesContext.getCurrentInstance();
return (T) fc.getApplication().getELResolver().getValue(fc.getELContext(), null, elName);
// Potential (untested) alternative:
// ((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getSession().getAttribute("")
}
Со всеми сеттерами / геттерами у меня возникла та же проблема (нулевая ссылка на пользователя) из-за отсутствия пустого конструктора в классе User.
В приведенном вами примере dataBrowser
и пользовательские бины создаются перед созданием таблицы, поэтому ссылки #{dataBrowser.userName}
должен уже найти userName @ManagedProperty
правильно впрыскивается (не будучи @PostConstruct
проблема).