问题:如何将 JiBX 绑定到具有包含多种类型对象的 List 的 JAXB POJO?
背景:我们正在尝试从 JAXB 迁移到 JiBX 以进行 XML 序列化以提高性能。但是,我们无法更改从 JAXB 生成的 POJO,因为它们是由我们的客户提供的。我在如何调整我binding.xml
以使用List
从 JAXB 生成的类型时遇到问题(没有用于 JAXB 生成列表的设置器)。
这是 XSD 片段
<xs:element name="contact_plan">
<xs:complexType>
<xs:sequence>
<xs:element ref="header" maxOccurs="1"/>
<xs:choice maxOccurs="unbounded">
<xs:element ref="ctp:asc_node" maxOccurs="unbounded"/>
<xs:element ref="ctp:desc_node" maxOccurs="unbounded"/>
<xs:element ref="ctp:exit_umbra" maxOccurs="unbounded"/>
<xs:element ref="ctp:enter_umbra" maxOccurs="unbounded"/>
<xs:element ref="ctp:contact" maxOccurs="unbounded"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
JAXB 生成的代码
/**
* Gets the value of the a property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the a property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getAs().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link D }
* {@link Ex }
* {@link A }
* {@link En }
* {@link C }
*
*
*/
public List<Object> getAs() {
if (as == null) {
as = new ArrayList<Object>();
}
return this.as;
}
JiBX 希望在绑定中执行此操作:
<mapping class="c" name="c">
<structure type="c" get-method="getHeader" set-method="setHeader"/>
<collection get-method="getAs" set-method="setAs"
create-type="java.util.ArrayList">
</collection>
</mapping>
setAs
生成的 JAXB POJO 上不存在该方法。因此Error: Nonstatic set-method setAs with argument of appropriate type not found in class.
抛出异常,我无法创建绑定。JiBX 生成的 POJO 还为每种类型提供单独的列表,而不是为所有类型提供一个列表。
我试过的:
- 我探索了为计划 xsd 元素类型创建自己的 Marshaller 和 Unmarshaller 的选项。但是,然后(据我所知)我还必须为列表中包含的每种类型编写自定义编组器/解组器(<--这个假设是否正确?)。如果可能的话,我宁愿避免这种情况。
- 我已经探索过尝试调整
binding.xml
以尝试将编组器用于列表中包含的类型,但是我认为没有办法仅使用 binding.xml 来做到这一点。
如果您有任何有用的经验或建议可以帮助解决我的问题,请提出建议。感谢您抽出宝贵时间,如果我能进一步澄清,请告诉我。