次のJavaオブジェクト階層があります。
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を使用して、ユーザー定義のXMLをJavaPOJOにOXマップしています。私は現在、マッパーをエイリアスで構成して、要素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
ようにすべての結石の結合を形成する本当に厄介な「hodgepodge」クラスを持つことです。
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-mapper構成の場合:
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);
これは私が調理できる唯一の回避策ですが、それは本当に厄介な感じであり、これを行うためのより良い方法があると信じなければなりません。前もって感謝します!