我正在从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>
有什么建议吗?
答案 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;
}