【问题标题】:Why is an exception thrown when an @ManagedProperty is referenced?为什么在引用 @ManagedProperty 时会引发异常?
【发布时间】:2012-10-01 23:36:47
【问题描述】:

我有一个带有视图范围 bean 和会话范围 bean 的 JSF Web 应用程序。我想从视图 bean 中修改会话 bean 的成员,并且我遵循了某个知名 JSF 人员的this 指南,但如果没有运行时异常,我似乎无法让它工作。对托管会话 bean 的引用,“home”在引用时为空,类似于 this question,除了我已经遵循接受答案的建议。

package brian.canadaShipping;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

@ManagedBean(name= "requestBean")
@ViewScoped
public class CpstcRequestBean implements Serializable {

@ManagedProperty(value="#{home}")
private CpstcHomeBean homeBean;


public CpstcHomeBean getHomeBean() {
    return homeBean;
}


public void setHomeBean(CpstcHomeBean homeBean) {
    this.homeBean = homeBean;
}


private static final long serialVersionUID = -5066913533772933899L;

public String testVar = "hello world";
private boolean displayOutput = false;

public boolean isDisplayOutput() {
    return displayOutput;
}


public void setDisplayOutput(boolean displayOutput) {
    this.displayOutput = displayOutput;
}


public String getTestVar() {
    return testVar;
}


public void setTestVar(String testVar) {
    this.testVar = testVar;
}


public CpstcRequestBean()
{
    System.out.println("TEST: " + homeBean.toString());
    System.out.println("Hello, ResuestBean!");
}

}

我的“home”bean的第一个位如下:

@ManagedBean(name= "home")
@SessionScoped
public class CpstcHomeBean implements Serializable {
    ...

更新:我遵循了 Jordan 的建议,并且在我的视图范围 bean 中有以下内容:

@ManagedBean(name= "requestBean")
@ViewScoped
public class CpstcRequestBean implements Serializable {

@Inject @Named("home") CpstcHomeBean homeBean;

public CpstcHomeBean getHomeBean() {
    return homeBean;
}


public void setHomeBean(CpstcHomeBean homeBean) {
    this.homeBean = homeBean;
}

public CpstcRequestBean()
{
    System.out.println("TEST: " + homeBean.toString());
    System.out.println("Hello, ResuestBean!");
}
...

以及我的会话范围 bean 中的这个:

@Named("home")
@SessionScoped
public class CpstcHomeBean implements Serializable {
...

但我的“home”bean 引用仍然为空。有什么想法吗?

更新 2: 事实证明,您必须在两个类中都使用 @Named,而不仅仅是注入的类。我的网络应用程序现在加载,但有些元素是空白的。在我的控制台日志中,我看到“目标无法访问,标识符‘home’解析为空。”我在 Tomcat 7 上运行,如果这会影响事情的话。有什么想法吗?

【问题讨论】:

    标签: jsf javabeans icefaces


    【解决方案1】:

    您可以将会话 bean 的 @ManagedBean 更改为 @Named,然后将其注入到视图范围的 bean 中,或者您可以像这样引用会话 bean:

    FacesContext fc = FacesContext.getCurrentInstance()
    private CpstcHomeBean homeBean = (CpstcHomeBean)  fc.getApplication().evaluateExpressionGet(fc, "#{home}", CpstcHomeBean.class);
    

    【讨论】:

    • 澄清一下,你的意思是写:@Named("home") 而不是:@ManagedBean(name="home")?我知道这似乎是一个基本的“RTFM”问题,但this API 对其在 JSF 中的用法并不清楚。 [此示例] 仅使用“@Named”,但我不确定 bean 的名称是在哪里定义的,如果它不是注释的参数并且没有在 faces-config.xml 中定义。
    • Yes : ) 然后使用@Inject 而不是 ManagedProperty
    • 我似乎无法导入“命名”类。 Eclipse 建议改用 javax.faces.event.NamedEvent...尝试使用 FacesContext 的替代方法会产生“无法解析类型 javax.el.E​​LException。它是从所需的 .class 文件间接引用的。”
    • 导入 javax.inject.Named 和 javax.inject.Inject
    • 我仍然在 home bean 引用上得到 NullPointerException。 :-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多