2013-01-22 102 views
4

我们使用JAXB用XML配置对象。我想知道是否有一种JAXB可以解决系统属性的方法。举例来说,如果我有属性颜色的豆,我希望能够做到这一点:jaxb可以解析系统属性吗?

<mybean color="${mycolor.in.data.property}" /> 

但如果我这样做,JAXB创建为myBean对象的颜色会等于字符串: mycolor.in.data.property

JAXB的弹簧中是否有等效的PropertyPlaceholderConfigurer,这样我的系统属性就可以解决了?

回答

3

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

} 
+0

好的,谢谢。其实我无权访问该类,因为这是导入的库的一部分。所以我更加关注在xml文件中直接配置它的方法,但它可能不可行。 – Melanie

+0

@Melanie - 如果您使用EclipseLink MOXy作为JAXB提供程序,那么您可以将元数据表示为XML文档(请参阅http://blog.bdoughan.com/2010/12/extending-jaxb-representing- annotations.html) 。或者,我已经更新了我的答案,以及如何使用StAX StreamReaderDelegate调整XML输入。 –