我有以下的Java對象層次:如何配置XStream根據XML屬性映射到不同的類?
public interface Function {
public void calculate(long t);
}
public class ConstantFunction implements Function {
private double constant;
@Override
public void calculate(long t) {
// ...
}
}
public class LinearFunction implements Function {
private double slope;
private double yIntercept;
@Override
public void calculate(long t) {
// ...
}
}
用戶可以通過定義它們中的XML,像這樣創造ConstantFunction
和LinearFunction
實例:
<myapp>
<function type="ConstantFunction>
<!-- ... -->
</function>
<function type="LinearFunction>
<!-- ... -->
</function>
</myapp>
我使用XStream把OX地圖的用戶定義XML到Java POJO。目前,我想要配置XStream
映射器別名,以便它知道什麼Java類綁定到function
元素:
XStream oxmapper = new XStream();
oxmapper.alias("myapp", MyApp.class);
oxmapper.alias("function", ???);
的問題是,我需要用邏輯配置XStream的,上面寫着:*如果function/type
是ConstantFunction
,然後使用oxmapper.alias("function", ConstantFunction.class)
;但如果其值爲LinearFunction
,則使用oxmapper.alias("function", LinearFunction.class)
。
問題是,我不認爲XStream API提供了一種以我需要的方式檢查XML以實現此邏輯的方法。 如果我錯了,請指點我正確的方向!
如果我是正確的,那麼我能想到的唯一解決辦法是具有形成所有Function
結核像這樣的工會真的很討厭的「大雜燴」類:
public class FunctionFactory implements Function {
private double constant;
private double slope;
private double yIntercept;
private Class<? extends Function> concreteClass;
@Override
public void calculate(long t) {
// Do nothing. This class is a workaround to limitations with XStream.
return;
}
}
在OX-映射配置:
oxampper.alias("function", FunctionFactory.class);
oxmapper.aliasField("function", "type", "concreteClass");
現在,每當我讀到一個XML實例爲MyApp
實例時,我需要糾正的轉換:
XStream oxmapper = getConfiguredMapper();
MyApp app = oxmapper.fromXml("<myapp>...</myapp>");
FunctionFactory factory = app.getFunction();
Function concretion = factory.getConcreteClass();
app.setFunction(concretion);
這是我可以做的唯一解決方法,但它感覺真的很討厭,我不得不相信還有更好的方法來做到這一點。提前致謝!