![](/img/trans.png)
[英]Java JAXB Marshalling: How to avoid adding the XmlElement during the marshalling for elements with 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>
我的問題是:
JAXB marshallers
無法將“ CustomXMLAdapter
”編組的內容與父級1 (UserInfo.class)
嵌入。 JAXB
是否有其他選擇可以做到這一點? BoundType
, ValueType
的XMLAdapter
。 為了將內容嵌入到父類編組中,是否需要指定任何特定類型? 通過允許您從域對象轉換為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.