我使用 Apache Camel + JAXB 进行肥皂处理。Java 眼镜是由一个名为 cxf-codegen-plugin 的 maven 插件生成的。
我面临的问题是,当我想使用一个列表属性时。在那种情况下,我总是会得到一个 JAXBElement 列表,而不是正确类的对象。
假设这个给定的 xml 被剪断:
<domainObjects avqxsi:type="avqsq:AssetAllocation" id="100" name="Some Name">
<nodes>101</nodes>
<nodes>102</nodes>
</domainObjects>
现在所有“节点”都是 type 的不同域对象的 id AANode
。所以在 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;
但是我在运行时实际得到的是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;