JAXBを使用して、いくつかのXSDファイルからJavaコードを生成しています。次に、OSGiコンテナー内で、生成されたコードにXMLファイルをアンマーシャリングしています。XSDはxsd:any要素を使用します:
<xsd:complexType name="GetReservationRSType">
<xsd:sequence>
<xsd:element name="Errors" type="pnrb:Errors.PNRB"
minOccurs="0" />
<xsd:choice>
<xsd:element name="Reservation" type="pnrb:Reservation.PNRB"
minOccurs="0" />
<xsd:element name="Content" minOccurs="0">
<xsd:complexType>
<xsd:choice>
<xsd:any processContents="lax" />
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
本番コードで機能させるのにいくつかの問題がありましたが、@ XmlSeeAlsoアノテーションを手動で追加したときに最終的に解決しました(@XmlSeeAlso(value = { OTATravelItineraryRS.class })
以下のコードで):
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "GetReservationRSType", propOrder = {
"warnings",
"errors",
"reservation",
"content"
})
@XmlSeeAlso({
GetReservationRS.class
})
public class GetReservationRSType {
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"any"
})
@XmlSeeAlso(value = { OTATravelItineraryRS.class })
public static class Content {
// ...
}
// ...
}
JAXBにそのような注釈を自動的に追加させる方法はありますか?たとえば、いくつかのJAXBバインディング構成オプションを追加するか、XSDファイルを変更しますか?
編集:
OSGi envの私のJAXBContextは、次の方法で初期化されます(生成されたすべてのパッケージ名をパラメーターとして取得します)-いくつかのJAXB関連の投稿で提案されているように、コロン区切り文字を使用してリストされています。
<bean id="jaxbContext" class="javax.xml.bind.JAXBContext" factory-method="newInstance">
<constructor-arg index="0" value="com.sabre.webservices.pnrbuilder:com.sabre.webservices.sabrexml._2003._07" />
</bean>
次の例外が発生します。
Caused by: javax.xml.bind.MarshalException
- with linked exception:
[javax.xml.bind.JAXBException: class com.sabre.webservices.sabrexml._2003._07.OTATravelItineraryRS nor any of its super class is known to this context.]
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:318)
at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:244)
at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:105)
at org.apache.camel.converter.jaxb.FallbackTypeConverter.marshall(FallbackTypeConverter.java:174)
at org.apache.camel.converter.jaxb.FallbackTypeConverter.convertTo(FallbackTypeConverter.java:88)
... 94 more
Caused by: javax.xml.bind.JAXBException: class com.sabre.webservices.sabrexml._2003._07.OTATravelItineraryRS nor any of its super class is known to this context.
at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:246)
at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:261)
at com.sun.xml.bind.v2.runtime.property.SingleReferenceNodeProperty.serializeBody(SingleReferenceNodeProperty.java:113)
at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:332)
at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:699)
at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:152)
at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:332)
at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:328)
at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:593)
at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:320)
at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494)
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:315)
... 98 more
Caused by: javax.xml.bind.JAXBException: class com.sabre.webservices.sabrexml._2003._07.OTATravelItineraryRS nor any of its super class is known to this context.
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:590)
at com.sun.xml.bind.v2.runtime.property.SingleReferenceNodeProperty.serializeBody(SingleReferenceNodeProperty.java:105)
... 107 more