Подтвердить что ты не робот

Не удается проанализировать XML-сообщение с помощью JAXB org.springframework.oxm.UnmarshallingFailureException

Я использую следующий код для разбора ответа soap, но я получаю UnmarshallingFailureException, я изменил @XmlSeeAlso на @XMLRootElement, но проблема все еще сохраняется. WSDL здесь.

  Caused by: javax.xml.bind.UnmarshalException: unexpected element 
       (uri:"ElsyArres.API", local:"SearchFlightsResponse"). Expected elements are 
       <{ElsyArres.API}Inbound>,<{ElsyArres.API}Leg>,<{ElsyArres.API}Legs>,
       <{ElsyArres.API}Outbound>,<{ElsyArres.API}Request>,<{ElsyArres.API}Response>,
       <{ElsyArres.API}SearchFlights>,<{ElsyArres.API}SoapMessage>

код

   @XmlRootElement(name = "SoapMessage")
   @XmlAccessorType(XmlAccessType.FIELD)
   public class WegoloSoapMessageResponse {
       @XmlElement(name = "Username")
       private String username;
       @XmlElement(name = "Password")
       private String password;
       @XmlElement(name = "LanguageCode")
       private String languageCode;
       @XmlElement(name = "ErrorMessage")
       private String errorMessage;
       @XmlElement(name = "ErrorCode")
       private int errorCode;
       @XmlElement(name = "AppVersion")
       private String appVersion;
       @XmlElement(name = "Request")
       private Request request;
       @XmlElement(name = "Response")
       private Response response;

       getters and setters


   @XmlRootElement(name = "Request")
   @XmlAccessorType(XmlAccessType.FIELD)
   public class Request {
       @XmlElement(name = "Departure")
       private String departure;
       @XmlElement(name = "Destination")
       private String destination;
       @XmlElement(name = "DepartureDate")
       private String departureDate;
       @XmlElement(name = "ReturnDate")
       private String returnDate;
       @XmlElement(name = "NumADT")
       private int numADT;
       @XmlElement(name = "NumINF")
       private int numInf;
       @XmlElement(name = "NumCHD")
       private int numCHD;
       @XmlElement(name = "CurrencyCode")
       private String currencyCode;
       @XmlElement(name = "WaitForResult")
       private boolean waitForResult;
       @XmlElement(name = "NearByDepartures")
       private boolean nearByDepartures;
       @XmlElement(name = "NearByDestinations")
       private boolean nearByDestinations;
       @XmlElement(name = "RROnly")
       private boolean rronly;
       @XmlElement(name = "MetaSearch")
       private boolean metaSearch;

       getters and setters


   @XmlRootElement(name="Response")
   @XmlAccessorType(XmlAccessType.FIELD)
   public class Response {
       @XmlElement(name="SearchFlightId")
       private String searchFlightId;
       @XmlElement(name="Roundtrip")
       private boolean roundTrip;
       @XmlElement(name="CurrencyCode")
       private String currencyCode;
       @XmlElement(name="Flights")
       private Flights flights;

       getters and setters



    @XmlSeeAlso(Flight.class)
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Flights {
       @XmlElement(name="Flight")
       private List<Flight> flight;

       getter and setter



   @XmlSeeAlso(Outbound.class)
   @XmlAccessorType(XmlAccessType.FIELD)
   public class Flight {

       @XmlElement(name = "Outbound")
       private Outbound outbound;
       @XmlElement(name="Inbound")
       private Inbound inbound;
       @XmlElement(name = "BagFee")
       private int bagFee;
       @XmlElement(name = "CcFee")
       private int ccFee;
       @XmlElement(name = "HandlingFee")
       private int handlingFee;
       @XmlElement(name = "TotalFare")
       private int totalFare;
       @XmlElement(name = "FlightId")
       private String flightId;
       @XmlElement(name = "Link2Book")
       private String link2Book;
       @XmlElement(name = "Provider")
       private String provider;

       getters and setters




   @XmlRootElement(name = "Outbound")
   @XmlAccessorType(XmlAccessType.FIELD)
   public class Outbound {

       @XmlElement(name="CarName")
       private String carName;
       @XmlElement(name="CarCode")
       private String carCode;
       @XmlElement(name="DepName")
       private String depName;
       @XmlElement(name="DepCode")
       private String depCode;
       @XmlElement(name="DestName")
       private String destName;
       @XmlElement(name="DestCode")
       private String destCode;
       @XmlElement(name="Duration")
       private String duration;
       @XmlElement(name="FlightNo")
       private String flightNo;
       @XmlElement(name="DepDateTime")
       private Date dapDateTime;
       @XmlElement(name="ArrDateTime")
       private Date arrDateTime;
       @XmlElement(name="Legs")
       private Legs legs;
       @XmlElement(name="Taxes")
       private int taxes;
       @XmlElement(name="FareADT")
       private int fareADT;
       @XmlElement(name="FareCHD")
       private int fareCHD;
       @XmlElement(name="FareINF")
       private int fareInf;
       @XmlElement(name="MiscFees")
       private int miscFees;
       @XmlElement(name="Idx")
       private int idx;
       @XmlElement(name="FareClass")
       private String fareClass;
       @XmlElement(name="FareType")
       private String fareType;
       @XmlElement(name="FareId")
       private String fareId;

       getters and setters



   @XmlRootElement(name="Legs")
   @XmlAccessorType(XmlAccessType.FIELD)
   public class Legs {
       @XmlElement(name="Leg")
       private Leg leg;

       getter and setter



   @XmlRootElement(name="Leg")
   @XmlAccessorType(XmlAccessType.FIELD)
   public class Leg {
       @XmlElement(name="Sequence")
       private int sequence;
       @XmlElement(name="FlightNo")
       private String flightNo;
       @XmlElement(name="DepCode")
       private String depCode;
       @XmlElement(name="DepName")
       private String depName;
       @XmlElement(name="DestCode")
       private String destCode;
       @XmlElement(name="DestName")
       private String destName;
       @XmlElement(name="DepTime")
       private String depTime;
       @XmlElement(name="ArrTime")
       private String arrTime;
       @XmlElement(name="CarCode")
       private String carCode;
       @XmlElement(name="CarName")
       private String carName;
       @XmlElement(name="FareClass")
       private String fareClass;
       @XmlElement(name="ArrDateTime")
       private Date arrDateTime;
       @XmlElement(name="DepDateTime")
       private Date depDateTime;

       getters and setters



    @XmlRootElement(name = "Inbound")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Inbound {
        @XmlElement(name="CarName")
        private String carName;
        @XmlElement(name="CarCode")
        private String carCode;
        @XmlElement(name="DepName")
        private String depName;
        @XmlElement(name="DepCode")
        private String depCode;
        @XmlElement(name="DestName")
        private String destName;
        @XmlElement(name="DestCode")
        private String destCode;
        @XmlElement(name="Duration")
        private String duration;
        @XmlElement(name="FlightNo")
        private String flightNo;
        @XmlElement(name="DepDateTime")
        private Date dapDateTime;
        @XmlElement(name="ArrDateTime")
        private Date arrDateTime;
        @XmlElement(name="Legs")
        private Legs legs;
        @XmlElement(name="Taxes")
        private int taxes;
        @XmlElement(name="FareADT")
        private int fareADT;
        @XmlElement(name="FareCHD")
        private int fareCHD;
        @XmlElement(name="FareINF")
        private int fareInf;
        @XmlElement(name="MiscFees")
        private int miscFees;
        @XmlElement(name="Idx")
        private int idx;
        @XmlElement(name="FareClass")
        private String fareClass;
        @XmlElement(name="FareType")
        private String fareType;
        @XmlElement(name="FareId")
        private String fareId;

        gettes and setters

jaxb.index

SearchFlights
Flight
Flights
Leg
Legs
Outbound
Request
Response
WegoloSoapMessage

package-info.java

@XmlSchema( 
    namespace = "ElsyArres.API",
    elementFormDefault = XmlNsForm.QUALIFIED) 
package com.myproject.flights.wegolo;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

ответ

1

введите описание изображения здесь

2

введите описание изображения здесь

3

введите описание изображения здесь

4

введите описание изображения здесь

5

введите описание изображения здесь

6

введите описание изображения здесь

4b9b3361

Ответ 1

Кажется, вы создаете свой beans вручную или, по крайней мере, редактируете их. Оба случая следует избегать. Вместо этого вы должны попытаться использовать доступные инструменты для создания классов Jaxb и клиентов Soap для вас. Два очень распространенных варианта: spring webservices или хорошо известная инфраструктура Apache CXF.

Ответ 2

В сообщении об ошибке указано, что вы пытаетесь проанализировать локальный node searchflightsresponse, который вы не отображаете в своих классах в качестве аннотации.

Вы должны объявить этот node, как вы это делали с другим.

Обратите внимание, что использование jaxb здесь для анализа ответа на мыло нецелесообразно, потому что структура (как вы можете видеть) не является тривиальной. Я предлагаю загрузить wsdl и создать клиентские заглушки для соответствия веб-сервису. Затем вам не нужно будет аннотировать сотни участников и классов.

См. также здесь: Как создать классы Java из файла WSDL

Ответ 3

Вам нужно использовать wsdl для генерации ответа xml. Создание ответа xml, который также, настолько большой, должен иметь отсутствующие элементы.

Вот учебник, который вы можете использовать, чтобы начать работу,

http://www.mkyong.com/webservices/jax-ws/jax-ws-wsgen-tool-example/ http://www.mkyong.com/webservices/jax-ws/jax-ws-hello-world-example-document-style/