问题:如何将JiBX绑定到包含多种类型对象的List的JAXB POJO?
背景:我们正在尝试从JAXB迁移到JiBX以进行XML序列化,以提高性能。但是,我们无法更改由JAXB生成的POJO,因为它们是由我们的客户提供的。我在如何调整binding.xml
以使用从JAXB生成的List
类型(没有为JAXB生成的列表的setter)方面遇到问题。
以下是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也为每种类型都有单独的列表,而不是所有类型的列表。
我尝试过的事情:
binding.xml
以尝试使用marshallers作为列表中包含的类型但是我不认为有一种方法可以使用绑定仅限.xml。如果您有任何有用的经验或建议可以帮助解决我的问题,请提供建议。感谢您的时间,如果我能进一步澄清,请告诉我。