2016-03-06 95 views
2

爲了編組JAXB類與Apache駱駝的JAXB類需要包括XmlRootElement將註釋。編組JAXB生成的類不XmlRootElement將與Apache駱駝

當從XSD生成JAXB類可能不會生成XmlRootElement將註釋。

編組 期間這將導致異常「沒有可用的類型轉換器從類型轉換:」

當我手動添加@XmlRootElement,一切工作正常,但由於產生這些JAXB類,手動添加anototation是沒有選擇的。

根據這樣的情況下,駱駝文檔中,JaxbDataFormat可以設置爲「fragement(真)

JaxbDataFormat jaxbMarshal = new JaxbDataFormat(); 
jaxbMarshal.setContextPath(ObjectFactory.class.getPackage().getName()); 
jaxbMarshal.setFragment(true); 

不幸的是我仍然得到同樣的異常。

是否有配置JaxbDataFormat不同,即定義的JAXBElement這是根元素,像我這一點在Java

marshaller.marshal(new JAXBElement(new QName("uri","local"), 
    MessageType.class, messageType)); 

做或有另一種策略可用來獲取XML編組的方法嗎?

編輯 的使用過的路線:

from("file://inbox").unmarshal(jaxbDataFormat) 
.marshal(jaxbDataFormat).to("file://outbox"); 

堆棧跟蹤:

產生java.io.IOException:org.apache.camel.NoTypeConversionAvailableException:沒有類型轉換器 可從類型轉換: com.xyz.AddressType爲所需的 類型:java.io.InputStream,值爲[email protected],在 org.apache.camel.converter.jaxb.JaxbDataFormat.marshal(JaxbDataFormat.java:148) 〜[camel-jaxb-2.16.0.jar:2.16.0] at org.apache.camel.processor.MarshalProcessor.process(MarshalProcessor.java:83) 〜[camel-core-2.16.0.jar: 2.16.0]在

...

[NA:1.8.0_25]在java.lang.Thread.run(Thread.java:745)[NA:ORG:1.8.0_25] 致.apache.camel.NoTypeConversionAvailableException:否 類型轉換器可用於從類型com.xyz.AddressType轉換爲 所需的類型:java.io.InputStream,值爲 [email protected] at org.apache.camel .impl.converter.BaseTypeConverterRegistry.mandato ryConvertTo(BaseTypeConverterRegistry.java:185) 〜[駱駝核心2.16.0.jar:2.16.0]在

...

+0

「沒有類型轉換器可用..」不是從DataFormat拋出,而是從TypeConverter拋出。你能顯示你正在使用的路線嗎? –

+0

那真正的錯誤和堆棧跟蹤呢? –

+0

您是否添加了指向您的jaxb類的jaxb.in​​dex文件? –

回答

1

我經歷了JAXB同等行爲(@XmlRootElement註釋在生成的類不存在),並且我想它來自根元素在XML模式中定義的方式。

例如:

<xsd:element name="DiffReport" type="DiffReportType" /> 
<xsd:complexType name="DiffReportType"> 
    ... 
</xsd:complexType> 

它會爲你生成的DiffReportType類沒有@XmlRootElement註解。但是,如果您直接將根元素定義爲以下內容,那麼您將在生成的類中獲得註釋集(在我的示例中,根類名稱爲DiffReport)。

<xsd:element name="DiffReport"> 
    <xsd:complexType> 
     ... 

注意:我使用第一種方法在我的模式中爲類名一致性定義複雜類型。

+0

是的你是對的,它會創建@XmlRootElement。不幸的是,我無法更改XSD。它已經被應用程序大量使用。我需要一個解決方案來處理沒有根元素的Jaxb類。無論如何謝謝你的信息。 – ABX

+0

看看相關的問題:http://stackoverflow.com/questions/819720/no-xmlrootelement-generated-by-jaxb –

0

您可以使用camel的jaxb數據格式的「partClass」選項。您的問題在camel docs for jaxb中得到解答,該文檔描述瞭如何編組XML文件(或者在沒有XmlRootElement註釋的情況下生成XML)。

0

使用partClass並提供您希望編組的實際班級名稱。在編組的情況下,您還必須提供partNamespace,它是所需XML對象的目標名稱空間。