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输入。 –