Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 从JSF提交时,datatable中的CDIBean列表为空_Jsf 2_Cdi - Fatal编程技术网

Jsf 2 从JSF提交时,datatable中的CDIBean列表为空

Jsf 2 从JSF提交时,datatable中的CDIBean列表为空,jsf-2,cdi,Jsf 2,Cdi,请注意:这个问题是关于CDI作用域的,因为我们在应用程序中使用CDI作用域,而不是JSF作用域 1) 当我们第一次来到这个页面时,位于requestScope(企业上下文)中的控制器Bean(TestController.java)被称为index_cut.xhtml 2) 在“加载”按钮上,我们加载以下方法以填充sapFinancialPeriodList,该列表工作正常并显示数据 >“> >“> >“> 3) 更改页面内容并提交后,sapFinancialPeriodList在以下方法中显

请注意:这个问题是关于CDI作用域的,因为我们在应用程序中使用CDI作用域,而不是JSF作用域

1) 当我们第一次来到这个页面时,位于requestScope(企业上下文)中的控制器Bean(TestController.java)被称为index_cut.xhtml

2) 在“加载”按钮上,我们加载以下方法以填充sapFinancialPeriodList,该列表工作正常并显示数据

>“>

>“>

>“>

3) 更改页面内容并提交后,
sapFinancialPeriodList
在以下方法中显示为空-

>“>

>“>


有什么建议吗?

您的bean是请求范围的,您只在操作而不是(post)上加载数据模型构造。当加载数据的操作完成后的HTTP响应时,bean将被丢弃。随后的请求将获得一个全新的bean实例,其所有属性都设置为默认值。但是,由于在(post)构造期间没有保留相同的数据模型,因此它将保持为空

在JSF2中,您可以使用
@ViewScoped
解决这个问题。这样,只要您通过回发(返回
null
void
)与同一视图交互,bean就会一直存在

在CDI中,您需要使用
@ConversationScoped
解决此问题,这反过来需要一些额外的
@injectconversation
样板,并在适当的时候完成
begin()
end()
调用。有关具体示例,请参见

另一种方法是通过命令链接/按钮中的
将负责创建数据模型的参数传递给后续请求,如下所示

<h:commandButton value="save" ...>
    <f:param name="period" value="#{bean.period}" />
</h:commandButton>
String period = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("period");
List<SapFinancialPeriod> sapFinancialPeriodList = someservice.list(period);

然后在请求范围bean的(post)构造函数中重新创建完全相同的数据模型,如下所示

<h:commandButton value="save" ...>
    <f:param name="period" value="#{bean.period}" />
</h:commandButton>
String period = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("period");
List<SapFinancialPeriod> sapFinancialPeriodList = someservice.list(period);
String period=FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(“period”);
List sapFinancialPeriodList=someservice.List(期间);
(顺便说一句,如果您使用的是标准JSF,那么使用
@ManagedProperty
可以更好地解决上述问题;据我所知,CDI没有能够将HTTP请求参数设置为bean属性的注释)

另见:


与具体问题无关,即将推出的JSF 2.2通过使用新的
@FlowScoped
注释和新的
xmlns:j=”的新特性,以更好的方式解决了这一功能需求http://java.sun.com/jsf/flow“
标记。

第3步提交的表单accounts基本上发送一个全新的HTTP请求。您的bean是请求范围的。你现在看到了吗@巴卢斯克:我们也试过对话范围。我一经要求就明白了这一点。你有什么建议?回答得好。我建议您查看ViewAccessScope,而不是使用ConversationScope。您可以在下一个版本中从Deltaspike获得它,或者现在从myfaces codi.Reqarding注入http请求参数获得它。我觉得没有人回答得足够清楚,所以我对它进行了问答@BalusC:它与ConversationScope一起工作——但我看到的奇怪的事情是,如果我保持RequestScope,并在提交时使用PostConstruct中的DB中的原始值重新加载bean,那么bean就能够保存并显示屏幕上更改的值。不使用f:param。这是ArrayList特有的—因此我尝试在Postconstruct中为Submit创建一个空ArrayList,但它不会从submitdata()中的屏幕中获取新值。它将只替换ArrayList中的任何现有值,前提是在Postconstruct中创建一个这样的ArrayList。提交的和本地的输入值存储在UI组件树状态中(其本身基本上位于视图范围内)。