3

Вопрос по jsf – @ManagedProperty не отражает изменения и продолжает возвращать ноль

Я пытаюсь внедрить значение одного сессионного компонента в bean-объект с видимостью, но он продолжает возвращать ноль, вот фрагмент: import javax.faces.application.FacesMessage; import javax.faces.bean.SessionScoped; import ...

У вас есть сеттер для<code>userName</code>? Вы нуждаетесь в том, чтобы заставить инъекцию работать.

от Matt Handy

Извините за поздний ответ, пасхальные выходные - да, извините, у меня это есть сразу после кода получателя: public void setUserName (String userName) {this.userName = userName;}

от Alaph432

решил - & gt; закончил тем, что переместил мои функции и использовал @PostConstruct, чтобы убедиться, что внедрение предшествовало использованию переменных

от Alaph432

Это бросило бы исключение, а не возвращение<code>null</code>.

от BalusC

... вам также нужен установщик в bean-компоненте @ViewScoped.

от Matt Handy

5 ответов

0

Я только что столкнулся с той же проблемой, и случайно обнаружил, что она не работает, если я пытаюсь с 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");
    }

Теперь в браузере затмений "achsooo" устанавливается и в icedove & quot; achsooo2222 & quot; устанавливается

0

Со всеми сеттерами / геттерами у меня возникла та же проблема (null ссылка на пользователя) из-заmissing empty constructor in User class.

В приведенном вами примереdataBrowser и пользовательские бины создаются перед созданием таблицы, поэтому ссылки#{dataBrowser.userName} должен уже найтиuserName @ManagedProperty правильно введено (не будучи@PostConstruct проблема).

2

Недавно у меня возникла проблема с внедрением вложенных свойств управляемого компонента@ManagedProperties тоже. Однажды введенный это никогда не изменилось. Я сделал обходной путь, оценивая EL в геттере, а не вводя его.

Попробуй это:

public String getUserName() {
    FacesContext context = FacesContext.getCurrentInstance();
    return (String) context.getApplication().evaluateExpressionGet(context,"#{user.userName}", String.class);
}

Вы также можете попробовать ввести всеuser боб и получитьuserName поле из него в геттер.

0

У меня была эта проблема, и проблема была на самом деле двоякой. (Обратите также внимание, что @ManagedProperty будет работать только в классе @ManagedBean, и если этот класс @ManagedProperty имеет ту же или меньшую область действия (приложение, сеанс, представление, запрос и т. Д.).) Вот как я это исправил:


Problem 1: JSF глуп и не обрабатывает@ManagedProperty впрыск правильно вabstract классы.

Solution:

  1. Make every class that uses @ManagedProperty be annotated with @ManagedBean.
  2. Make every abstract class that uses the property not be annotated with @ManagedProperty and instead only provide abstract getter and setter methods that non-abstract classes will each override.
  3. Use the abstract class's getter method instead of the @ManagedProperty itself in abstract classes.

Problem 2: JSF глуп и не обрабатывает@ManagedProperty правильное внедрение в классы @ManagedBean, не созданные JSF (т.е. вы сами создаете эти классы, используяnew).

Solution options:

  • Let JSF create the class that uses the @ManagedProperty.
  • Us,e the following code:

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("")
}
0

#{user.userName} интерпретируется JSF какgetUser().getUserName()

Так что лучше иметь@ManagedProperty типаUser, с его методами получения / установкиgetUser/setUser, При этом вы можете получить доступ к имени пользователя с помощью#{user.userName}.

Похожие вопросы