【发布时间】:2015-08-25 14:16:42
【问题描述】:
我使用 Apache Camel + JAXB 进行 Soap 处理。 Java 眼镜是由一个名为 cxf-codegen-plugin 的 maven 插件生成的。
我面临的问题是,当我想使用一个列表属性时。在这种情况下,我总是会得到一个 JAXBElement 列表,而不是正确类的对象。
假设这个给定的 xml 被剪断:
<domainObjects avqxsi:type="avqsq:AssetAllocation" id="100" name="Some Name">
<nodes>101</nodes>
<nodes>102</nodes>
</domainObjects>
现在所有“节点”都是AANode 类型的不同域对象的ID。所以在 xsd 中是这样定义的:
<xsd:complexType name="AssetAllocation">
<xsd:complexContent>
<xsd:extension base="avqsq:DomainObject">
<xsd:sequence>
<xsd:element ecore:reference="avqsq:AANode" maxOccurs="unbounded" name="nodes" type="xsd:IDREF"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
我已经定义了一些 bindings.xml:
<jaxb:bindings node="xsd:complexType[@name='AssetAllocation']//xsd:element[@name='nodes']">
<jaxb:property>
<jaxb:baseType name="my.api.xsd.AANode"/>
</jaxb:property>
</jaxb:bindings>
我想要的是这样的 POJO 属性:
@XmlElementRef(name = "nodes")
protected List<AANode> nodes;
但我在 runtime 实际得到的是 List<JAXBElement<AANode>>,它会导致 ClassCastException。
编辑 1:
我错过了 cxf-codegen 框架正在生成一个类的事实,您可以清楚地看到该属性用JAXBElement.class 注释,我认为这是错误的。有趣的是,手动将注释更改为 AANode.class 将失败,并出现 IllegalAnnotationException: AANode" 或其任何子类在此上下文中未知。
public class AssetAllocation
extends DomainObject
implements Serializable, Equals, HashCode, ToString
{
@XmlElementRef(name = "nodes", type = JAXBElement.class)
protected List<AANode> nodes;
【问题讨论】:
标签: java soap jaxb apache-camel cxf-codegen-plugin