我正在尝试将我的应用程序升级到最新版本的 jars,特别是我已经从:
JSF 2.1.12 -->> 2.2.1
春季网络流 2.3.1 -->> 2.4.0
Primefaces 3.4.1 -->> 4.0
弹簧芯 3.2.0.M1
应用程序运行良好,但系统中的每个 p:datatable 都显示为空,默认消息“未找到记录。”,而我作为值传递的数据模型列表不为空。这是一个简单的例子:
流量:
<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"
parent="GlobalMenu_subflows">
<persistence-context />
<view-state id="test" view="../views/test.xhtml">
<on-entry>
<evaluate expression="textManager.getAllTexts(brandNames)" result="viewScope.texts" result-type="dataModel"/>
<set value="'fixed'" name="viewScope.contentGroup"/>
</on-entry>
</view-state>
</flow>
其中 textManager.getAllTexts 返回一个 TranslatedText 列表。结果类型dataModel的转换器是默认的,我没有覆盖它。
@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
public List<TranslatedText> getAllTexts(String brandNames)
{
return textDao.findAllTranslatedTextByBrandNames(brandNames);
}
页面是:
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui"
xmlns:sv="http://www.synaptic.com/sb"
xmlns:t="http://myfaces.apache.org/tomahawk"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:sf="http://www.springframework.org/tags/faces"
template="/WEB-INF/layouts/standard.xhtml">
<ui:define name="content">
<div>
<h:form id="viewForm" >
<h:panelGroup id="textFormPanel" name="textFormPanel">
<sv:csrfHidden />
<p:dataTable id="viewTable"
name="viewTable"
var="text"
rowIndexVar="rowIndex"
value="${texts}"
paginator="true"
rows="10"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
paginatorPosition="bottom"
styleClass="adminDataTable"
rowKey="#{text.id}">
<p:column filterBy="#{text.key}" filterMatchMode="contains">
<f:facet name="header">
<h:outputText value="Key" />
</f:facet>
<h:outputText value="${text.key}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Component" />
</f:facet>
<h:outputText value="${text.component}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Type" />
</f:facet>
<h:outputText value="${text.type}" />
</p:column>
</p:dataTable>
</h:panelGroup>
</h:form>
</div>
</ui:define>
</ui:composition>
迁移之前一切正常,我在控制台中完全没有错误。我正在使用 eclipse 进行测试和调试,我确信 TranslatedText 的列表已满(大约 2000 行)。
我检查了所有迁移指南,但找不到任何可能产生此错误的参考。我怀疑它与数据模型有关。有人有什么想法吗?
非常感谢您的帮助。
马蒂亚
####### *编辑* #########
我正在尝试所有可能的组合,并缩小了原因。
首先肯定不是 Primefaces 问题,JSF h:dataTable 和 c:forEach 也可以正常工作。但是我无法切换回以前的 webflow,因为 2.4 之前的任何内容在到达页面之前都会惨遭失败。
该错误确实来自 webflow(或来自 JSF 和 webflow 的交互),因为如果我将 OneSelectionTrackingListDataModel 对象移动到托管 bean 中而不是使用 webflow flowScope 一切正常。
@Component("testFlowObject")
public class TestFlowObject {
public OneSelectionTrackingListDataModel model;
public OneSelectionTrackingListDataModel getModel() {
return model;
}
public void setModel(OneSelectionTrackingListDataModel model) {
this.model = model;
}
}
<view-state id="test" view="../views/test.xhtml">
<on-entry>
<evaluate expression="textManager.getAllTexts(brandNames)" result="flowScope.texts" result-type="dataModel"/>
<evaluate expression="testFlowObject.setModel(texts)"/>
<set value="'fixed'" name="viewScope.contentGroup"/>
</on-entry>
</view-state>
现在我可以重构整个系统,让它像这样工作,如果这是一个更好的做法的话。但我想了解发生了什么并尝试解决错误的原因。有人有什么想法吗?