4

JAXBを使用して、XMLでオブジェクトを構成します。JAXBがシステムプロパティを解決できる方法があるかどうか疑問に思いました。たとえば、プロパティcolorのBeanがある場合、それを実行できるようにしたいと思います。

<mybean color="${mycolor.in.data.property}" />

しかし、そうすると、JAXBはmybeanオブジェクトを作成し、色は文字列と等しくなります。 mycolor.in.data.property

システムプロパティを解決できるように、JAXB用のPropertyPlaceholderConfigurerに相当するものは春にありますか?

4

1 に答える 1

3

AnXmlAdapterは、マーシャリング/アンマーシャラー中にオブジェクトを別のオブジェクトに変換できるようにするJAXB(JSR-222)メカニズムです。XmlAdapterシステムプロパティ名を実際の値に変換するを書くことができます。

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class ColorAdapter extends XmlAdapter<String, String> {

    @Override
    public String unmarshal(String v) throws Exception {
        return System.getProperty(v);
    }

    @Override
    public String marshal(String v) throws Exception {
        return v;
    }

}

次に、@XmlJavaTypeAdapterアノテーションを使用XmlAdapterしてプロパティのを構成します。

@XmlJavaTypeAdapter(ColorAdapter.class)
public String getColor() {
    return color;
}

詳細については


アップデート

よろしくお願いします。これはインポートされたライブラリの一部であるため、実際にはクラスにアクセスできません。そのため、これをxmlファイルで直接構成する方法を探していましたが、おそらく不可能です。

クラスを変更できない場合は、を使用しStreamReaderDelegateてXML入力を変更できます。テキスト/文字データを処理するメソッドがいくつかあるため、使用しているJAXB実装で最適に機能するメソッドをオーバーライドしていることを確認するために実験する必要がある場合があります。

import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.stream.util.StreamReaderDelegate;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    public static void main(String[] args) throws Exception {

        JAXBContext jc = JAXBContext.newInstance(MyBean.class);

        XMLInputFactory xif = XMLInputFactory.newFactory();
        StreamSource source = new StreamSource("input.xml");
        XMLStreamReader xsr = xif.createXMLStreamReader(source);
        xsr = new StreamReaderDelegate(xsr) {

            @Override
            public String getText() {
                String text = super.getText();
                if(text.contains("${")) {
                    text = System.getProperty(text);
                }
                return text;
            }

        };

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        unmarshaller.unmarshal(xsr);
    }

}
于 2013-01-22T10:02:51.863 に答える