Jsf 应用范围bean';的视图未更新

Jsf 应用范围bean';的视图未更新,jsf,jakarta-ee,jsf-2,Jsf,Jakarta Ee,Jsf 2,我在应用程序范围的bean中有一个变量。用户可以通过方法调用触发此变量的更新。现在的问题是,在刷新jsf页面之后,用户没有得到这个变量的更新视图。如果您已经测试了变量是否正确更新,那么更新方法是否正常工作。应用程序范围bean中的变量是否声明为final,或者这里的问题是什么?如果使用了错误的注释组合,则可能会发生这种情况。例如 import javax.enterprise.context.ApplicationScoped; import javax.faces.bean.ManagedBe

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

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

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

@ManagedBean
@ApplicationScoped
public class App {}
这里,范围注释来自CDI,bean管理注释来自JSF。JSF不识别CDI范围注释,因此默认为
@NoneScoped
。也就是说,在每一次EL
{app}
评估中都会重构bean。这就解释了你看到的症状

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

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

@ManagedBean
@ApplicationScoped
public class App {}

CDI范围注释只能与CDIBean管理注释
@Named

结合使用,显然它不是同一个实例。你需要运行一个调试器,或者至少显示一个SSCCE,这样我们才能看到并指出你的错误。是的,你是对的。我认为应用程序范围的bean只实例化一次。如果不是这样的话,那么只有一个实例的唯一方法就是在方法签名中传递它?在这种情况下,我想我更喜欢单例Bean,因为您使用了错误的注释。我发布了一个答案。嗯,不,我使用的是正确的导入(都来自javax.faces),我在EJB中使用@inject注入了应用程序范围的bean……这真的很奇怪。。我做了一些调试:根据jsf页面的第一个请求创建了一个bean实例。第二个实例是在创建使用应用程序范围bean的EJB时创建的。在此之后,每当创建新的EJB实例时,都会使用应用程序范围bean的相同(第二个)实例。但是用户总是只看到首先创建的应用程序范围的bean,因此没有视图更新……您不能使用
@inject
注入JSF托管bean。用CDI管理的bean替换它。我没有完全理解它。实例化bean的正确方法是什么?甚至可以将应用程序范围的jsf托管bean注入EJB吗?我在教程/网络搜索中找不到示例。。。