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")。处理规则的每个实现的逻辑很简单。希望这能有所帮助。