Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot parse XML message with JAXB org.springframework.oxm.UnmarshallingFailureException

I am using following code to parse soap response but I am receiving UnmarshallingFailureException, I changed @XmlSeeAlso to @XMLRootElement but the problem still persists. WSDL is here.

  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>

Code

   @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

1

enter image description here

2

enter image description here

3

enter image description here

4

enter image description here

5

enter image description here

6

enter image description here

like image 527
Daniel Newtown Avatar asked Jan 16 '16 09:01

Daniel Newtown


3 Answers

The error message states, that you are trying to parse the local node searchflightsresponse which you do not map within your classes as an annotation.

You have to declare this node as you have done it with the other before.

Please note that using jaxb here to parse a soap response is not advisable because the structure is (as you can see) not trivial. I suggest to download the wsdl and generate client stubs to match the webservice. You then won't need to annotate hundreds of members and classes.

See also here: How to generate java classes from WSDL file

like image 107
Marcinek Avatar answered Oct 29 '22 15:10

Marcinek


It seems you are creating your beans manually or at least are editing them. Both cases should be avoided. Instead you should try to use available tools to generate Jaxb classes and Soap clients for you. Two very common options are spring webservices or the well known Apache CXF framework.

like image 29
Hendrik Jander Avatar answered Oct 29 '22 15:10

Hendrik Jander


You need to use wsdl to generate response xml. Building a response xml, that also, so big, is bound to have elements missing.

Here is a tutorial you can use to get your started,

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/

like image 1
Abhishek Anand Avatar answered Oct 29 '22 15:10

Abhishek Anand