2016-01-16 31 views
12

Sto utilizzando il seguente codice per analizzare la risposta al sapone ma sto ricevendo UnmarshallingFailureException, ho modificato @XmlSeeAlso su @XMLRootElement ma il problema persiste. WSDL è here.Impossibile analizzare il messaggio XML con 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> 

Codice

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

Response

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

Date un'occhiata a questo link: http://stackoverflow.com/questions/32181738/unmarshallingfailureexception-jaxb-unmarshalling -exception-nested-exception-is – AbhishekAsh

risposta

1

Sembra si creano i fagioli manualmente o almeno sta loro modifica. Entrambi i casi dovrebbero essere evitati. Invece dovresti provare a usare gli strumenti disponibili per generare classi Jaxb e clienti Soap per te. Due opzioni molto comuni sono spring webservices o il noto Apache CXF framework.

+0

Grazie per la tua risposta, sto cercando di generarlo tramite Maven ma ho un altro problema che puoi trovare qui http://stackoverflow.com/questions/35108965/how-to-use- a-class-personalizzazione-to-risolvere-file-generating-conflitti –

3

Gli stati messaggio di errore, che si sta tentando di analizzare il nodo locale searchflightsresponse che non si mappa all'interno delle classi come un'annotazione.

Devi dichiarare questo nodo come hai fatto prima con l'altro.

Si prega di notare che l'uso di jaxb qui per analizzare una risposta di sapone non è consigliabile perché la struttura è (come potete vedere) non banale. Suggerisco di scaricare wsdl e generare stub client per abbinare il servizio web. Non sarà quindi necessario annotare centinaia di membri e classi.

vedi anche qui: How to generate java classes from WSDL file