Java jaxb可以解析系统属性吗?
我们使用JAXB用XML配置对象。我想知道是否有一种方法可以让JAXB解析系统属性。例如,如果我有一个具有属性颜色的bean,我希望能够做到:Java jaxb可以解析系统属性吗?,java,xml,properties,jaxb,unmarshalling,Java,Xml,Properties,Jaxb,Unmarshalling,我们使用JAXB用XML配置对象。我想知道是否有一种方法可以让JAXB解析系统属性。例如,如果我有一个具有属性颜色的bean,我希望能够做到: <mybean color="${mycolor.in.data.property}" /> 但如果我这样做,JAXB将创建mybean对象,颜色将等于字符串: mycolor.in.data.property JAXB是否有spring中的任何等价物,以便解析我的系统属性?一个XmlAdapter是一种机制,允许您在编组/解编程序期间
<mybean color="${mycolor.in.data.property}" />
但如果我这样做,JAXB将创建mybean对象,颜色将等于字符串:
mycolor.in.data.property
JAXB是否有spring中的任何等价物,以便解析我的系统属性?一个
XmlAdapter
是一种机制,允许您在编组/解编程序期间将一个对象转换为另一个对象。您可以编写一个XmlAdapter
,将系统属性名称转换为实际值
import javax.xml.bind.annotation.adapters.XmlAdapter;
公共类ColorAdapter扩展了XmlAdapter{
@凌驾
公共字符串解组(字符串v)引发异常{
返回系统.getProperty(v);
}
@凌驾
公共字符串封送处理程序(字符串v)引发异常{
返回v;
}
}
然后使用@XmlJavaTypeAdapter
注释为属性配置XmlAdapter
@XmlJavaTypeAdapter(ColorAdapter.class)
公共字符串getColor(){
返回颜色;
}
了解更多信息
更新
好的,谢谢。实际上我没有访问该类的权限,因为这是一部分 一个导入的库。因此,我更希望找到一种配置的方法 这直接存在于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-如果您使用EclipseLink MOXy作为JAXB提供程序,那么您可以将元数据表示为xml文档(请参阅)。或者,我更新了我的答案,告诉您如何使用StAX
StreamReaderDelegate
来调整XML输入。