Castor哈希表多态性



Good Day

我正试图使用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>

我不确定这里是否有足够的细节或问题来给出准确的答案,但我做了一些非常类似的事情,遇到了一些障碍。我想我会提供我的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默认值是必需的="false")。处理规则的每个实现的逻辑很简单。希望这能有所帮助。

相关内容

  • 没有找到相关文章