com.sun.istack.SAXException2:Instance ...替换为“java.lang.Object”,但是...绑定到匿名类型

时间:2014-01-14 15:55:40

标签: java xml jaxb jaxb2

我正在从1.x版本将项目升级到jaxb 2.2.7。

我的应用程序在某些时候工作,但在一些回复中我看到了:

java.lang.RuntimeException: javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.SAXException2: Instance of "com.mycompany.global.er.decoupling.binding.response.PricePointType$BalanceImpactRates$BalanceImpactRate" 
is substituting "java.lang.Object", but 
"com.mycompany.global.er.decoupling.binding.response.PricePointType$BalanceImpactRates$BalanceImpactRate"
 is bound to an anonymous type.]

这在jaxb 1.0中运行良好。我不知道问题是什么。

以下是xsd的摘录(我无法更改,因为客户端正在使用它):

<xs:complexType name="price-pointType">
    <xs:sequence>
        <xs:element name="id" type="xs:string" />
.........
        <xs:element name="duration" type="durationType" />
        <xs:element name="order" type="xs:int" />
        <xs:element name="min-sub-period" type="xs:int" />
        <xs:element name="balance-impacts" minOccurs="0">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="balance-impact" type="charging-resourceType"
                        minOccurs="0" maxOccurs="unbounded" />
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:element name="balance-impact-rates" minOccurs="0">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="balance-impact-rate" minOccurs="0"
                        maxOccurs="unbounded">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="rate" type="xs:double" />
                            </xs:sequence>
                            <xs:attribute name="charging-resource-code" type="xs:string"
                                use="required" />
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

问题原来是匿名复杂类型的精心嵌套。

通过如下分离它们,问题就消失了。作为额外的奖励,我获得了更多可重复使用的代码。

    <xs:complexType name="balanceImpactRate">
    <xs:sequence>
        <xs:element name="rate" type="xs:double" />
    </xs:sequence>
    <xs:attribute name="charging-resource-code" type="xs:string"
    use="required" />

</xs:complexType>


<xs:complexType name="balanceImpactRates" >
    <xs:sequence>
        <xs:element name="balance-impact-rate" type="balanceImpactRate"   minOccurs="0"
            maxOccurs="unbounded">
        </xs:element>
    </xs:sequence>
</xs:complexType>

答案 1 :(得分:1)

在尝试编组我从hibernate-mapping-4.0.xsd

生成的一些jaxb obejct时,我遇到了同样的异常

抛出的异常似乎涉及两个类,这些类是作为类HibernateMapping根类的内部类生成的 - &#34; Id&#34;和&#34; CompositeID&#34;。这两个元素都在XSD中定义为嵌套的complexTypes,就像在@mdarwin的情况下一样。通过移动complexType定义(以便它们是xsd中&#34; schema&#34;元素的根元素),问题就解决了,并且对象被成功封送。

我本来希望使用未经修改的XSD来生成我的jaxb对象,这是一种耻辱 - 但无法找到解决问题的另一种方法。

答案 2 :(得分:0)

我提到的情况不取决于xsd-schema中的<xs:complexType>定义。

实际的问题是,我们有从xml-schema生成的类 extends 扩展的Java类。

这些类都用@XmlType(name = "")注释,以使它们匿名(即,生成的标记不包含xsi:type属性,并且生成的xml文件对于初始模式仍然有效。

我在java, xsd & marshalling: jre bug, my fault or xsd issues?中找到了此解决方案的线索。

由于我无法修改xsd(太复杂了,已经与我们的API客户端共享),解决方案是:

  • 制作一个jaxb-binder,它排除要生成到Java文件中的complexType,并说JAXB改用现有的类。 绑定文件如下所示:

    <jxb:bindings schemaLocation="MySchema.xsd">
        <jxb:bindings node="//xs:complexType[@name='TheClassYouWantToExclude']">
            <jxb:class ref="my.existing.class.TheClassYouWantToExclude"/>
        </jxb:bindings>
    </jxb:bindings>
    

  • 在现有的类中,我们需要扩展的类不是用JAXB注释的类,而只是一个抽象类:


    package my.existing.class;

    public abstract class TheClassFromWhichYouWantToExtend {
    }
  • 从父类链接到此类的字段用@XmlAnyElement(lax = true)注释:

    package my.existing.class;

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(...)
    public class TheClassYouWantToExclude {

        // ...
        @XmlAnyElement(lax = true)
        protected TheClassFromWhichYouWantToExtend theClassFromWhichYouWantToExtend;
    }