Java 将JiBX绑定到包含多种对象类型的列表的JAXB POJO?
问题:如何将JiBX绑定到包含多种对象类型的列表的JAXB POJO 背景:为了提高性能,我们正在尝试从JAXB迁移到JiBX进行XML序列化。但是,我们不能更改从JAXB生成的POJO,因为它们是由我们的客户提供的。我在如何调整我的Java 将JiBX绑定到包含多种对象类型的列表的JAXB POJO?,java,binding,jaxb,xml-serialization,jibx,Java,Binding,Jaxb,Xml Serialization,Jibx,问题:如何将JiBX绑定到包含多种对象类型的列表的JAXB POJO 背景:为了提高性能,我们正在尝试从JAXB迁移到JiBX进行XML序列化。但是,我们不能更改从JAXB生成的POJO,因为它们是由我们的客户提供的。我在如何调整我的binding.xml以使用从JAXB生成的List类型方面遇到了问题(JAXB生成的列表没有setter) 下面是XSD代码段 <xs:element name="contact_plan"> <xs:complexType>
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>
*
*
*
*列表中允许以下类型的对象
*{@linkd}
*{@link Ex}
*{@linka}
*{@link En}
*{@link C}
*
*
*/
公共列表getAs(){
if(as==null){
as=新的ArrayList();
}
把这个还给我;
}
JiBX希望在绑定中执行此操作:
生成的JAXB POJO上不存在setAs
方法。因此,异常错误:在类中找不到具有适当类型参数的非静态set方法setAs。
被抛出,我无法创建绑定。JiBX生成的POJO对于每种类型都有单独的列表,而不是所有类型都有一个列表
我所尝试的:
JAXBContext
是线程安全的,因此请确保创建一个并重用它。2)不同源的解组性能不同,我建议从XMLStreamReader
(尝试Woodstox实现)中解组。3) 禁用架构验证,除非您确实需要它,因为它会减慢解组速度。@BlaiseDoughan我们正在执行所有这些操作,但禁用验证除外。
/**
* 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;
}
<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>