将JiBX绑定到具有包含多种类型对象的List的JAXB POJO?

时间:2013-04-24 16:33:57

标签: java binding jaxb xml-serialization jibx

问题:如何将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也为每种类型都有单独的列表,而不是所有类型的列表。

我尝试过的事情

  1. 我探索了为计划xsd元素类型创建自己的Marshaller和Unmarshaller的选项。然而,(据我所知)我还必须为列表中包含的每种类型编写自定义编组器/解组器(&lt; - 这个假设是否正确?)。如果可能的话,我宁愿避免这种情况。
  2. 我已经探索过尝试调整binding.xml以尝试使用marshallers作为列表中包含的类型但是我不认为有一种方法可以使用绑定仅限.xml。
  3. 如果您有任何有用的经验或建议可以帮助解决我的问题,请提供建议。感谢您的时间,如果我能进一步澄清,请告诉我。

0 个答案:

没有答案