XmlAdapter
是一個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;
}
更多信息
UPDATE
好的謝謝。其實我無權訪問該課程,因爲這是導入庫的 的一部分。因此,我更直接地在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);
}
}
好的,謝謝。其實我無權訪問該類,因爲這是導入的庫的一部分。所以我更加關注在xml文件中直接配置它的方法,但它可能不可行。 – Melanie
@Melanie - 如果您使用EclipseLink MOXy作爲JAXB提供程序,那麼您可以將元數據表示爲XML文檔(請參閱http://blog.bdoughan.com/2010/12/extending-jaxb-representing- annotations.html) 。或者,我已經更新了我的答案,以及如何使用StAX StreamReaderDelegate調整XML輸入。 –