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

3

Я пытаюсь внедрить значение одного сессионного компонента в bean-объект с видимостью, но он продолжает возвращать ноль, вот фрагмент:

<code>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;
}
</code>

И он используется в:

<code>@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;
}
</code>

dataBrowser используется для заполнения таблицы данных Primefaces, когда он называется userName и имеет значение null, и я не уверен, почему.

Это бросило бы исключение, а не возвращениеnull. BalusC
решил - & gt; закончил тем, что переместил мои функции и использовал @PostConstruct, чтобы убедиться, что внедрение предшествовало использованию переменных Alaph432
Извините за поздний ответ, пасхальные выходные - да, извините, у меня это есть сразу после кода получателя: public void setUserName (String userName) {this.userName = userName;} Alaph432
... вам также нужен установщик в bean-компоненте @ViewScoped. Matt Handy
У вас есть сеттер дляuserName? Вы нуждаетесь в том, чтобы заставить инъекцию работать. 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

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

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

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:

Make every class that uses @ManagedProperty be annotated with @ManagedBean. 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. 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("")
}

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