2012-10-25 127 views
0

我在应用程序作用域bean中有一个变量。用户可以通过方法调用触发此变量的更新。现在问题在于刷新jsf页面后用户没有得到这个变量的更新视图。如果已测试变量是否已正确更新且已更新,则更新方法可正常工作。应用程序作用域bean中的变量是否声明为final或此处存在什么问题?应用程序作用域bean的视图没有更新

+0

显然它不是同一个实例。您需要运行一个调试器或至少显示一个SSCCE,以便我们可以看到并指出您的错误。 – BalusC

+0

是的你是对的。我认为应用程序范围的bean只实例化了一次。所以如果不是这种情况,只有一个实例的唯一方法是在方法签名中传递它?在这种情况下,我认为我更喜欢Singleton Bean – nico1510

+0

显然你使用了错误的注释。我发布了一个答案。 – BalusC

回答

0

如果您使用了注释的错误组合,就会发生这种情况。例如。

import javax.enterprise.context.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 

@ManagedBean 
@ApplicationScoped 
public class App {} 

这里,范围注释来自CDI,而bean管理注释来自JSF。 JSF不识别CDI范围注释,因此默认为@NoneScoped。即在每个单独的EL #{app}评估中重新构建豆。这解释了你所看到的症状。

您需要将范围注释修复为来自JSF。

import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 

@ManagedBean 
@ApplicationScoped 
public class App {} 

的CDI范围的注解只能结合使用与CDI豆管理注释@Named

+0

嗯,不,我正在使用正确的导入(都来自javax.faces),我用@Inject在EJB中注入了应用程序范围的bean ... – nico1510

+0

这真的很奇怪..我做了一些调试:bean的一个实例是在jsf页面的第一次请求时创建的。第二个实例是在创建使用应用程序范围的bean的EJB时创建的。在此之后,每当创建一个新的EJB实例时,就会使用应用程序作用域bean的相同(第二个)实例。但用户总是只能看到首先创建的应用程序范围的bean,因此没有视图更新... – nico1510

+0

您无法使用'@Inject'注入JSF托管的bean。用CDI管理的bean替换它。 – BalusC

相关问题