簡體   English   中英

JAXB XMLAdapter編組的問題

[英]Issue with JAXB XMLAdapter marshalling

我需要使用JAXB2生成以下格式的XML文件,它具有固定可變 xml內容。

什么是約束?

可變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部分,我使用了公共的Parent類( 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 (如下所示)。 但是輸出不是預期的。 沒有正確地將Variable XML部分嵌入帶有Fixed 1的部分

產量

 <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 ”編組的內容與父級1 (UserInfo.class)嵌入。
  2. 我們在JAXB是否有其他選擇可以做到這一點?
  3. 如何指定BoundTypeValueTypeXMLAdapter 為了將內容嵌入到父類編組中,是否需要指定任何特定類型?

通過允許您從域對象轉換為JAXB可以更好地處理編組/解組目的的另一個值對象, XmlAdapter起作用。

如果其他模式中的所有模型對象實際上都是BaseUserType子類,那么您需要做的就是讓JAXBContext意識到它們。 在創建JAXBContext時,可以通過用冒號分隔所有包名稱的String來完成此操作。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM