0

良い一日

castor を使用して、抽象クラスの複数の実装を持つ HashTable を構築しようとしています。これが親の「構成」です

<class name="com.Config">
    <map-to xml="config" />
    <field name="rulesMap" collection="hashtable">
        <bind-xml  auto-naming="deriveByClass"  >
            <class name="org.exolab.castor.mapping.MapItem">
                <field name="key" type="java.lang.String">
                    <bind-xml name="name" node="attribute" />
                </field>
                <field name="value" type=com.Rule">

                </field>
            </class>
        </bind-xml>
    </field>
</class>

「com.Rule」は抽象クラスであり、一日の終わりには、このような xml 構造体が必要です

<config>
<rule-impl1 name="ruleType1Instance1" ruleField="field"  />
    <rule-impl2 name="ruleType2Instance2" ruleField="field" ruleImpl2Field1="..." />
</config>
4

1 に答える 1

0

ここで正確な回答を得るのに十分な詳細や適切な形式の質問があるかどうかはわかりませんが、かなり似たようなことをしていて、いくつかの障害に遭遇しました. 私は私の2セントを提供すると思った。私は他の XML フレームワークほど Castor に精通していません。私の場合、Castor は自動マーシャリング/アンマーシャリングを行っており、手動でコードを記述していつ実行するかを決定しています。その部分を手動で行っていた場合、抽象クラスを拡張する特定のクラスに非整列化する決定を下すことができたと思いました。

私のすべての免責事項を邪魔にならないようにして、あなたに何ができるでしょうか。

**リクエスト/レスポンスにフィールドを追加できる場合は、次のようなものを作成します。

public class RuleContainer {
 private RuleType ruleType;  // possibly build enum or other non-java equivalent
 private RuleImpl1 ruleImpl1;
 private RuleImpl2 ruleImpl2;
 private RuleImpl...N ruleImpl...N;
 // getters & setters, etc
}

次に、テーブルの値が次のように変更されます

<field name="value" type="com.RuleContainer"></field>

RuleContainer のマッピングを含めます

 <class name="com.RuleContainer">
   <field name="ruleType" type="com.RuleType"
   <field name="ruleImpl1" type="com.RuleImpl1">
   <field name="ruleImpl2" type="com.RuleImpl2">
   <field name="ruleImpl...N" type="com.RuleImpl...N">
 </class>

また、各実装のマッピングがどのように見えるかを含めます。私の場合、各実装のマッピングを個別のファイルに分割し、

<include href="" /> 

タグを使用して、これらの不要なマッピングを親ファイルに含めます。

これにより、その RuleType フィールドを使用して、RuleContainer 内のどのルールが有効であるかを知ることができます (キャスターのデフォルトは required="false" であるため、残りは null になります)。ルールの各実装で動作するロジックは、そこから簡単に記述できます。お役に立てれば。

于 2014-07-11T16:48:45.427 に答える