@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 классы.

Решение:

  1. Сделайте каждый класс, который использует @ManagedProperty быть аннотированным @ManagedBean,
  2. Сделать каждый abstract класс, который использует свойство, не будет аннотировано @ManagedProperty и вместо этого предоставляют только абстрактные методы получения и установки, которые каждый неабстрактный класс будет переопределять.
  3. Использовать 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 проблема).

Другие вопросы по тегам