2013-01-22 99 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輸入。 –