Orbeon Forms 3.8.0.201005141856 CE を使用しています。
ページにモデルが多すぎると、Orbeon は stackoverflow エラーをスローします。初期化中に、メイン モデルで xforms-rebuild が実行され、すべてのモデルで再構築/再検証/再計算が起動されます。
モデルが多すぎると、スタック オーバーフローのために終了しません。
いくつかの再帰性があることは理解できます。最初のモデルは、他のすべてのモデルもそうでない限り検証を終了していない可能性がありますが、スタックは次のようになります。
最初の数行はランダムです。これらは、オーバーフローした瞬間に実際に呼び出されるメソッドです。残りは次の無限ループです。
org.orbeon.oxf.xforms.xbl.XBLContainer synchronizeAndRefresh XBLContainer.java 696 org.orbeon.oxf.xforms.xbl.XBLContainer endOutermostActionHandler XBLContainer.java 669 org.orbeon.oxf.xforms.XFormsModel rebuildRecalculateRevalidateIfNeeded XFormsModel.java 1120 org.orbeon. oxf.xforms.xbl.XBLContainer rebuildRecalculateRevalidateIfNeeded XBLContainer.java 723 org.orbeon.oxf.xforms.xbl.XBLContainer rebuildRecalculateRevalidateIfNeeded XBLContainer.java 733 org.orbeon.oxf.xforms.xbl.XBLContainer rebuildRecalculateRevalidateIfNeeded XBLContainer.java 7 xforms.xbl.XBLContainer rebuildRecalculateRevalidateIfNeeded XBLContainer.java 733
たぶん、ここでいくつかのレベルの再帰性を避けることができますか?
とにかく、私はそれを修正できるとは思えません。しかし、多分私は私のフォームに何かを修正することができます. そして、モデルが多すぎる問題であることを確認したいと思います。
私のフォームはオンザフライで作成され、使用されるデータに関する情報がないため、私のケースは少し特殊です。少し簡略化すると、次のようになります (これは、アイデアを与えるための疑似コードにすぎません)。
可能なデータを定義するテンプレートがあります。複数のテンプレートがあり、それぞれに複数の属性を含めることができます。
<!-- This defines data templates, known at form creation -->
<xf:instance>
<templates>
<template id="template_1">
<attribute id="attribute_1_1" type="string" />
<attribute id="attribute_1_2" type="date" />
</template>
<template id="template_2">
<attribute id="attribute_2_1" type="int" />
<attribute id="attribute_2_2" type="dateTime" />
</template>
</templates>
</xf:instance>
次に、データ。複数のオブジェクトが存在する可能性があり、それぞれが上記のテンプレートの 1 つを使用します。テンプレートの属性を含めることができますが、すべてではありません。また、無視されるテンプレート以外の属性を含めることもできます。同じテンプレートを使用する複数のオブジェクトが存在する場合があります。オブジェクトによって使用されないテンプレートが存在する可能性があります。
<!-- This is the data, unknown at form creation -->
<xf:instance id="objects">
<data>
<object template="template_1">
<attribute name="attribute_1_1">value</attribute>
<attribute name="unknownAttribute">value</attribute>
</object>
...
</data>
</xf:instance>
表示するようになりました:
<!-- Repeat on objects -->
<xf:repeat nodeset="instance('objects')/object">
<!-- A XBL that can display a template from its template definition node
<fr:templateDisplay template="instance('templates')/template[@id = ./@template]" />
</xf:repeat>
XBL 自体は、テンプレート レベルで同じことを行います。
<xbl:binding id="templateDisplay" />
<xbl:implementation>
<xf:model>
...
</xf:model>
</xbl:implementation>
<xbl:template>
<!-- A repeat on the attribute definition of the attributes -->
<xf:repeat>
<!-- A XBL that changes its control depending on datatype -->
<fr:genericInput type="" data=""/>
</xf:repeat>
<xbl:template>
</xbl:binding>
genericInput XBL には、データ型に応じて入力にさまざまな種類が含まれます。バインドではさまざまな @type を使用できます。単純な xbl にすることも、datepicker にすることもできます。読み取り/書き込み/読み取り専用にすることも、単一/多値。
問題は、5 つの属性を含むテンプレートがある場合、オブジェクトごとに (少なくとも) 6 つの XBL が生成されるため、再構築するモデルが 6 つになることです。
最初は、クラッシュする前に 20 個のオブジェクトを管理できました。また、他のすべての xbl (オブジェクトごとに少なくとも 12 個の xbl/モデル) で使用されるローカリゼーション xbl があり、それと他のいくつかのものを削除しました。クラッシュする前に最大 60 オブジェクトになりましたが、目標は 200 です。
xbl で xsl を使用して、genericInput を削除しようと考えました。しかし、私は XSL に詳しくないので、改善につながることを確認したいと思います。
または、これらの再構築をフィルタリングして、まだ機能しているフォームを持つことは可能ですか? それらを再帰的にする方法はありますか?
それとも、私が間違っていて、モデル数の問題ではないのでしょうか?
ヒントをいただければ幸いです。