(这个问题不需要了解XStream)
下面是请求XML结构,它使用XStream对Root java bean进行解组 -
<Root>
<Entity>
<Action>...</Action>
<Type>...</Type>
<Data>...</Data>
</Entity>
</Root>
由于数据节点是多态的,它可以映射到任一个bean,即 DataABC,DataPQR,DataXYZ 等等:
<Data>
<A>aaa</A>
<B>bbb</B>
<C>ccc</C>
</Data>
or
<Data>
<P>ppp</P>
<Q>qqq</Q>
<R>rrr</R>
</Data>
or
<Data>
<X>xxx</X>
<Y>yyy</Y>
<Z>zzz</Z>
</Data>
xstream有助于对bean进行umarshaling,如:
Root root = xstream.fromXML(rootXML)
有一个 Configurer接口,它通过将一个部分的xml标签映射到实际的pojo bean来帮助配置XStream对象:
interface Configurer<T> {
public void configure(T t);
}
enum ConfigurersLib implements Configurer<XStream> {
ROOT("Root", Root.class),
ENTITY("Entity", Entity.class),
TYPE("Type", Type.class),
ACTION("Action", Action.class),
// polymorphic data tag configurers
DATA_ABC("Data", DataABC.class),
DATA_PQR("Data", DataPQR.class),
DATA_XYZ("Data", DataXYZ.class),
;
@Override
public void configure(XStream xs){
xs.alias(this.xmlTag, this.classType);
}
//constructor
private ConfigurersLib(String tag, Class classType){
this.xmlTag = tag;
this.classType = classType;
}
...
}
对于给定的请求类型 - 我可以将一些配置程序组合成一个责任链,其中一个链是一个EnumSet:
如果Type = ABC则调用链 - {ROOT,ENTITY,ACTION,TYPE,DATA_ABC}
如果Type = PQR则调用链 - {ROOT,ENTITY,ACTION,TYPE,DATA_PQR}
如果Type = XYZ则调用链 - {ROOT,ENTITY,ACTION,TYPE,DATA_XYZ}
上图比较简单但不幸的是这些配置器的数量很大(50-100 +),因此在创建这样的组时可能会丢失一些Configurer枚举元素。这也可能会降低一些清晰度。
问题 什么是最好的方式(模式/技巧/标准)来确保 -
如何定义完整性(如果我们为给定的传入请求覆盖了所有标签,则配置器设置已完成)
如何使分组容易被覆盖(对于某些特殊情况,我们可能想要使用PQR而不是ABC。或默认为XYZ等)