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美分。我对 Castor 不像其他一些 XML 框架那样熟悉,在我的情况下,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 中的哪个规则是有效的(其余的将为 null,因为 Castor 默认为 required="false")。使用规则的每个实现的逻辑很容易从那里编写。希望这可以帮助。

于 2014-07-11T16:48:45.427 回答