2016-01-16 26 views
12

Używam następujący kod do analizowania odpowiedzi mydła, ale otrzymuję UnmarshallingFailureException, zmieniłem @XmlSeeAlso na @XMLRootElement, ale problem nadal występuje. WSDL to here.Nie można przeanalizować komunikatu XML za pomocą JAXB org.springframework.oxm.UnmarshallingFailureException

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> 

Kod

@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; 

reakcji

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

+0

Wystarczy popatrzeć na ten link: http://stackoverflow.com/questions/32181738/unmarshallingfailureexception-jaxb-unmarshalling -exception-nested-exception-is – AbhishekAsh

Odpowiedz

1

Wydaje tworzysz swoje fasolę ręcznie lub przynajmniej są ich edycji. Należy unikać obu przypadków. Zamiast tego powinieneś spróbować użyć dostępnych narzędzi do generowania klas Jaxb i klientów Soap. Dwiema bardzo popularnymi opcjami są spring webservices lub dobrze znany Apache CXF framework.

+0

Dziękuję za odpowiedź, próbuję wygenerować ją za pośrednictwem Mavena, ale mam inny problem, który można znaleźć tutaj http://stackoverflow.com/questions/35108965/how-to-use- Konflikty typu-class-to-resolve-generujące pliki –

3

państw komunikat o błędzie, który próbuje zanalizować lokalny węzeł searchflightsresponse, których nie mapujesz w swoich klasach jako adnotacja.

Musisz zadeklarować ten węzeł, tak jak zrobiłeś to wcześniej z drugim.

Należy pamiętać, że używanie tutaj jaxb do parsowania odpowiedzi na mydło nie jest wskazane, ponieważ struktura jest (jak widać) nie banalna. Sugeruję pobranie pliku wsdl i wygenerowanie kodu pośredniczącego klienta w celu dopasowania do usługi internetowej. Wtedy nie będziesz musiał dodawać adnotacji do setek członków i klas.

Zobacz też tutaj: How to generate java classes from WSDL file