2

次の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);

これは私が調理できる唯一の回避策ですが、それは本当に厄介な感じであり、これを行うためのより良い方法があると信じなければなりません。前もって感謝します!

4

1 に答える 1

0

XStream でカスタム動作が必要な場合は、コンバーター チュートリアルで説明されているように、コンバーターを使用する必要があります。

于 2012-09-24T19:34:42.207 に答える