アプリケーションをjarの最新バージョンにアップグレードしようとしています。特に、次から移動しました:
JSF 2.1.12 -->> 2.2.1
春のウェブフロー 2.3.1 -->> 2.4.0
プライムフェイス 3.4.1 -->> 4.0
スプリングコア 3.2.0.M1
アプリケーションは正常に実行されますが、システム内のすべての p:datatable が空として表示され、デフォルトのメッセージ「No records found.」が表示されますが、値として渡すデータモデル リストは空ではありません。簡単な例を次に示します。
流れ:
<?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行)。
すべての移行ガイドを確認しましたが、このエラーが発生する可能性のある参照は見つかりませんでした。dataModel と関係があると思われます。誰でも何か考えがありますか?
助けてくれてありがとう。
マティア
####### *編集* #########
考えられるすべての組み合わせを試して、原因を絞り込みました。
JSF h:dataTable や c:forEach も機能するため、最初は Primefaces の問題ではないことは確かです。しかし、ページに到達する前に 2.4 が惨めに失敗する前に、以前の Webflow に戻すことはできません。
Webflow flowScope を使用する代わりに OneSelectionTrackingListDataModel オブジェクトをマネージド Bean 内に移動すると、すべて正常に動作するため、エラーは実際に Webflow (または JSF と Webflow の相互作用) から発生します。
@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>
より良い方法であれば、システム全体をこのように動作するようにリファクタリングできます。しかし、何が起こっているのかを理解し、エラーの原因を修正したいと思います. 誰でも何か考えがありますか?