我想一个sessionscoped豆的价值注入一个viewscoped豆,但它一直返回null,这里有一个片段:
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数据表,当它被称为用户名为空,我不知道为什么。
最近我有通过注入嵌套管理bean属性问题@ManagedProperties
了。 一旦注射它从来没有改变过。 我在吸气评估EL,而不是将其注入做了一个解决方法。
尝试:
public String getUserName() {
FacesContext context = FacesContext.getCurrentInstance();
return (String) context.getApplication().evaluateExpressionGet(context,"#{user.userName}", String.class);
}
您也可以尝试注入整个user
豆和获得userName
在吸气从IT领域。
随着地方都制定者/吸气,我是有, 因为用户缺少类空构造的同样的问题( 空引用到用户)。
在这个例子中,你提供的, dataBrowser
和用户豆类构建表之前被实例化,所以引用#{dataBrowser.userName}
应该已经找到userName @ManagedProperty
正确地注射(并非@PostConstruct
问题)。
我只是碰到了同样的问题来了,发现一个偶然的机会,它不工作,如果我用Firefox尝试(其实linux下是icedove),但好工作,如果我尝试用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“achsooo2222”被设定。
#{user.userName}
由JSF解释为getUser().getUserName()
因此,最好是有一个@ManagedProperty
类型的User
,其getter / setter方法getUser
/ setUser
。 这样,您可以通过访问该用户的姓名#{user.userName}
。
我有这个问题,而这个问题实际上是双重的。 (另请注意,@ManagedProperty将永远只能在一个@ManagedBean类工作,如果@ManagedProperty类是相同或更小的范围(应用,会话视图,请求等)的。)下面是我如何固定它:
问题1:JSF是愚蠢的,不处理@ManagedProperty
在适当的注射abstract
类。
解:
- 请使用每类
@ManagedProperty
与被注解@ManagedBean
。 - 使每一个
abstract
使用该属性不被注解类@ManagedProperty
,而是只提供抽象的getter和setter方法,非抽象类各倍率。 - 使用
abstract
类的getter方法,而不是在@ManagedProperty本身abstract
类。
问题2:JSF是愚蠢的,不处理@ManagedProperty
在没有JSF创建@ManagedBean类正确注射(即您使用自己创建这些类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("")
}