2012-10-01 31 views
0

我有一个带有视图范围的bean和会话范围的bean的JSF Web应用程序。我想从视图bean中修改会话bean的成员,并且我遵循了来自某个知名JSF人员的this指南,但似乎无法在没有运行时异常的情况下使其工作。受管会话bean的引用“home”在引用时为空,类似于this question,但我已经遵循接受的答案的建议。为什么引用@ManagedProperty时引发异常?

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!"); 
} 

} 

我的“家”豆的第一位如下:

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

更新:我跟随乔丹的建议,并在我看来作用域的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引用仍然为空。有任何想法吗?

UPDATE 2:事实证明,您必须在两个类中使用@Named,而不仅仅是注入类。我的网络应用现在加载,但一些元素是空白的。在我的控制台日志中,我看到“Target Unreachable,标识符'home'解析为null”。我在Tomcat 7上运行,如果这影响了事情。有任何想法吗?

回答

0

您可以您的会话bean的@ManagedBean改为@命名,然后只把它注射到你的看法范围的bean,也就是我们这样的,你可以参考的会话bean:

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

我想弄清楚,你意思是说,写: @Named( “家”) 代替: @ManagedBean(name = “家”) ?我知道这似乎是一个基本的“RTFM”问题,但[this](http://docs.oracle.com/javaee/6/api/javax/inject/Named.html)API的用法并不那么明确在JSF中。 [这个例子]只是使用“@Named”,但我不确定在哪里定义了bean的名称,如果它不是注释的参数,并且它没有在faces-config.xml中定义。 – StockB

+0

是的:)然后使用@Inject而不是ManagedProperty –

+0

我似乎无法导入“命名”类。 Eclipse建议使用javax.faces.event.NamedEvent代替...尝试使用FacesContext的备用方法产生“无法解析javax.el.E​​LException类型,它是从所需的.class文件间接引用的。” – StockB