2013-05-14 55 views
2

我有一個要求生成XML文件下面使用JAXB2格式,它同時具有固定可變 XML內容。問題與JAXB XMLAdapter編組

什麼是約束?

可變XML部分的含量應的一個的5個不同的XML schema(計劃有JAXB2.0實現5個不同的Java類來生成它),這是需要被嵌入在固定XML內容。

XML格式:

<user_info> 
    <header>  //Fixed XML Part 
    <msg_id>..</msg_id> 
    <type>...</type> 
    </header> 
    <user_type> // Variable XML content 
         // (userType : admin, reviewer, auditer, enduser, reporter) 
    ........ 
    </user_type> 
</user_info> 

我試過嗎?

我已爲上述XML metadata創建了一個JAXB註釋的Java類。對於可變的XML部分,我使用了共同的父類(BaseUserType),它被所有5個不同的類<user_type>擴展。並嘗試使用@XmlJavaTypeAdapter覆蓋marshall(..)操作。 (如下)

JAXB註解類:

@XmlRootElement(name="user_info") 
public class UserInfo { 

    private Header header; //reference to JAXB annotated Class Header.class 

    @XmlJavaTypeAdapter(value=CustomXMLAdapter.class) 
    private BaseUserType userType; // Base class - acts as a common Type 
            // for all 5 different UserType JAXB annotated Classes 

    // Getters setters here.. 
    // Also tried to declare JAXB annotations at Getter method 
} 

自定義XML適配器類別:

public class CustomXMLAdapter extends XmlAdapter<Writer, BaseInfo> { 
     private Marshaller marshaller=null; 

     @Override 
     public BaseInfo unmarshal(Writer v) throws Exception { 
      // Some Implementations here... 
     } 

     @Override 
     public Writer marshal(BaseInfo v) throws Exception { 
       OutputStream outStream = new ByteArrayOutputStream(); 
       Writer strResult = new OutputStreamWriter(outStream); 
       if(v instanceof CustomerProfileRequest){ 
        getMarshaller().marshal((CustomerProfileRequest)v, strResult); 
       } 
       return strResult; 
     } 

     private Marshaller getMarshaller() throws JAXBException{ 
       if(marshaller==null){ 
         JAXBContext jaxbContext = JAXBContext.newInstance(Admin.class, Reviewer.class, Enduser.class, Auditor.class, Reporter.class); 
         marshaller = jaxbContext.createMarshaller(); 
       } 
       return marshaller; 
     } 
} 

哪裏我現在掙扎?

我沒有面臨任何錯誤或警告,正在生成XML(如下所示)。但產出不是預期的產出。它沒有嵌入變量XML部分與正確的一個

輸出

<user_info> 
     <header> 
      <msg_id>100</msg_id> 
      <type>Static</type> 
     </header> 
     <user_type/> // Empty Element, even though we binded the value properly. 
    </user_info> 

我的問題是:

  1. 爲什麼JAXB marshallers不能嵌入 「CustomXMLAdapter」 編組內容與家長一個(UserInfo.class)
  2. 我們有一個任何替代選項JAXB做到這一點簡單嗎?
  3. 如何指定XMLAdapter中的BoundType,ValueType。爲了將內容嵌入到父類編組中,是否有任何特定類型?
+1

+1對於提出的問題 – 2013-05-14 13:10:35

回答

1

XmlAdapterXmlAdapter通過允許您從您的域對象轉換爲JAXB可以更好地處理用於編組/解組目的的另一個值對象。

如果從其他架構中的所有模型對象都是BaseUserType真子類,那麼所有你需要做的是使JAXBContext意識到它們的存在。您可以在創建JAXBContext時通過冒號分隔包含所有包名稱的字符串來執行此操作。

JAXBContext jc = JAXBContext.newInstance("com.example.common:com.example.foo:com.example.bar");