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;
}
Для получения дополнительной информации
ОБНОВЛЕНИЕ
Хорошо спасибо. На самом деле у меня нет доступа к классу, так как он является частью импортированной библиотеки. Поэтому я больше искал способ настроить это непосредственно в файле 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);
}
}
person
bdoughan
schedule
22.01.2013