0

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

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 {
...

但我的“家”bean 引用仍然为空。有任何想法吗?

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

4

1 回答 1

0

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

FacesContext fc = FacesContext.getCurrentInstance()
private CpstcHomeBean homeBean = (CpstcHomeBean)  fc.getApplication().evaluateExpressionGet(fc, "#{home}", CpstcHomeBean.class);
于 2012-10-02T00:18:16.057 回答