応答メッセージの xsd が提供されており、xml 応答を jaxb 生成クラスに解析しようとしています。最初に、ルート xml 要素が「response」と呼ばれる問題がありましたが、「response」と呼ばれるネストされたクラスもあったため、コンパイル エラーが発生していました。これを修正するために、xsd で jaxb:class アノテーションを使用して、ネストされたクラスが「response」ではなく「callReport7Response」として生成されるように作成されたネストされた Java クラスの名前を変更できることがわかりました。
<xs:element name="callReport7" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="request">
<xs:annotation><xs:appinfo><jaxb:class name="callReport7Request"/></xs:appinfo></xs:annotation>
<xs:complexType>
<xs:complexContent>
<xs:extension base="xs:anyType">
<xs:attribute name="time" type="xs:string"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="response">
<xs:annotation><xs:appinfo><jaxb:class name="callReport7Response"/></xs:appinfo></xs:annotation>
<xs:complexType>
<xs:complexContent>
<xs:extension base="xs:anyType">
<xs:attribute name="time" type="xs:string"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
残念ながら、応答をアンマーシャリングしようとすると、「callReport7Response」を「response」に解析できないというエラーが表示されます
Java は次のようになります。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"any"})
@XmlRootElement(name = "response")
public static class CallReport7Response {
@XmlAnyElement
protected List<Element> any;
@XmlAttribute
protected String time;
ネストされたオブジェクトをトップレベルのオブジェクトにキャストしようとしているようです。
09:28:34,608 ERROR [STDERR] java.lang.ClassCastException: uk.co.test.dashboard.dal.Response$Insurer$Subject$CallReport7$CallReport7Response cannot be cast to uk.co.test.dashboard.dal.Response
このコードを使用して非整列化しています:
Response response = new Response();
StringReader reader = new StringReader(resp);
try {
JAXBContext context = JAXBContext.newInstance(response.getClass());
Unmarshaller unmarshaller = context.createUnmarshaller();
Object o = unmarshaller.unmarshal(reader);
response = (Response) o;
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}