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);
}
}