[英]ERROR: Could not read [class java.lang.String]; nested exception is org.springframework.oxm.UnmarshallingFailureException
[英]Cannot parse XML message with 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
五
6
錯誤消息指出,您正在嘗試解析本地節點searchflightsresponse
,您沒有將其作為注釋映射到類中。
您必須先聲明此節點,因為之前已經使用了另一個節點。
請注意,在這里使用jaxb來解析soap響應是不可取的,因為結構(如你所見)並非無足輕重。 我建議下載wsdl並生成客戶端存根以匹配webservice。 然后,您不需要注釋數百個成員和類。
另請參見: 如何從WSDL文件生成java類
您似乎手動創建bean或至少正在編輯它們。 應該避免這兩種情況。 相反,您應該嘗試使用可用的工具為您生成Jaxb類和Soap客戶端。 兩個非常常見的選項是spring webservices或眾所周知的Apache CXF框架 。
您需要使用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-例如,文檔樣式/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.