2

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

我试过的

  1. 我探索了为计划 xsd 元素类型创建自己的 Marshaller 和 Unmarshaller 的选项。但是,然后(据我所知)我还必须为列表中包含的每种类型编写自定义编组器/解组器(<--这个假设是否正确?)。如果可能的话,我宁愿避免这种情况。
  2. 我已经探索过尝试调整binding.xml以尝试将编组器用于列表中包含的类型,但是我认为没有办法仅使用 binding.xml 来做到这一点。

如果您有任何有用的经验或建议可以帮助解决我的问题,请提出建议。感谢您抽出宝贵时间,如果我能进一步澄清,请告诉我。

4

0 回答 0