gpt4 book ai didi

jaxb - marshal JAXB 生成的类没有 XmlRootElement 与 Apache Camel

转载 作者:行者123 更新时间:2023-12-04 17:28:35 35 4
gpt4 key购买 nike

为了使用 Apache Camel 编码 jaxb 类,jaxb 类需要包含一个 XmlRootElement 注释。

从 XSD 生成 jaxb 类时,可能不会生成 XmlRootElement 注释。

这将在编码期间导致异常
“没有可用于从类型转换的类型转换器:”

一旦我手动添加@XmlRootElement,一切正常,但由于生成了这些 Jaxb 类,手动添加注释是没有选择的。

根据这种情况下的 Camel 文档,可以将 JaxbDataFormat 设置为 'fragment(true)

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: No type converter available to convert from type: com.xyz.AddressType to the required type: java.io.InputStream with value com.xyz.AddressType@32317e9d at 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] at

...

[na:1.8.0_25] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_25] Caused by: org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: com.xyz.AddressType to the required type: java.io.InputStream with value com.xyz.AddressType@32317e9d at org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:185) ~[camel-core-2.16.0.jar:2.16.0] at

...

最佳答案

我经历了 JaxB 的等效行为(生成的类中不存在 @XmlRootElement 注释),我想它来自 XML 模式中定义根元素的方式。

例如:

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

它将为您生成 DiffReportType没有 @XmlRootElement 的类注解。但是,如果您按如下方式直接定义根元素,您将在生成的类中获得注释集(在我的示例中,根类的名称为 DiffReport)。
<xsd:element name="DiffReport">
<xsd:complexType>
...

注意:为了类名的一致性,我使用第一种方法在我的模式中定义复杂类型。

关于jaxb - marshal JAXB 生成的类没有 XmlRootElement 与 Apache Camel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35828383/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com