java - 无法使用 JAXB org.springframework.oxm.Unmarshal

我正在使用以下代码解析soap响应,但我收到UnmarshallingFailureException,我将@XmlSeeAlso更改为@XMLRootElement,但问题仍然存在。 WSDL 是 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>

代码

   @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.in​​dex

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

最佳答案

错误消息指出,您正在尝试解析本地节点 searchflightsresponse,您没有将其映射到类中作为注释。

您必须像之前对另一个节点所做的那样声明此节点。

请注意,这里不建议使用 jaxb 来解析 soap 响应,因为结构(如您所见)并非微不足道。我建议下载 wsdl 并生成客户端 stub 以匹配 web 服务。这样您就不需要注释数百个成员和类。

另见此处: How to generate java classes from WSDL file

关于java - 无法使用 JAXB org.springframework.oxm.UnmarshallingFailureException 解析 XML 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34825333/

相关文章:

java - 由于缺少 EmbeddedServletContainerFactory bean,无

java - AsyncContext 响应与原始传入请求不匹配?

spring - 如何在集成测试阶段使用 Spring 嵌入式数据库初始化脚本?

java - 使用 mockito 进行 Spring 服务单元测试

java - 如何覆盖 Spring 3.1 @PropertySource 以设置 IgnoreR

java - JtaTransactionManager 和 ChainedTransactionM

spring - IntelliJ + Tomcat + Spring-Loaded

java - 如何在 Hibernate 中使用面向对象编程?

spring - 使用 Spring Security 的 OAuth 2.0 中的 resourc

java - 如何在 Spring 中构建 SOAP 客户端?