簡體   English   中英

UnmarshallingFailureException:JAXB解組異常; 嵌套的異常是javax.xml.bind.UnmarshalException

[英]UnmarshallingFailureException: JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException

我正在嘗試發送SOAP請求並通過WebServiceTemplate接收響應,但是我收到以下異常:

WSDL在這里

SEVERE: Servlet.service() for servlet [bb] in context with path [/Bb] threw 
exception [Request processing failed; nested exception is 
org.springframework.oxm.UnmarshallingFailureException: JAXB unmarshalling 
exception; nested exception is javax.xml.bind.UnmarshalException: unexpected 
element (uri:"http://ticketmaster.productserve.com/v2/soap.php", 
local:"findEventsResponse"). Expected elements are <{}findEvents>,<{}request>,
<{}sortTicket>] with root cause

請求

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({Request.class})
public class FindEvents {
    @XmlElement
    private Request request;

           getter / setter
}


@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({SortTicket.class})
public class Request {
    @XmlElement
    private String apiKey;
    @XmlElement
    private String country;
    @XmlElement
    private int resultsPerPage;
    @XmlElement
    private int currentPage;
    @XmlElement(name = "Sort")
    private SortTicket sort;
    @XmlElement
    private String[] filters;
    @XmlElement
    private String updatedSince;

           getters / setters
}

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class SortTicket {
    @XmlElement
    private String field;
    @XmlElement
    private String order;

           getters / setters
}

響應

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({Return.class})
public class FindEventsResponse {
    @XmlElement
    private Return returnResult;

           getters / setters
}

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({Details.class,Results.class})
public class Return {
    @XmlElement
    private Details details;
    @XmlElement
    private Results results;

           getters / setters
}

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Details {
    @XmlElement
    private int totalResults;
    @XmlElement
    private int totalPages;
    @XmlElement
    private int currentPage;
    @XmlElement
    private int resultsPerPage;

    getters / setters
}

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({ Artist.class, Venue.class })
public class Results {
    @XmlElement
    private long eventId;
    @XmlElement
    private String ticketmasterEventId;
    @XmlElement
    private String status;
    @XmlElement
    private String name;
    @XmlElement
    private String url;
    @XmlElement
    private String eventDate;
    @XmlElement
    private String onSaleDate;
    @XmlElement
    private String preSaleDate;
    @XmlElement
    private int categoyId;
    @XmlElement
    private String parentCategory;
    @XmlElement
    private int parentCategoryId;
    @XmlElement
    private Double minPrice;
    @XmlElement
    private Double maxPrice;
    @XmlElement(name = "Artists")
    private Artist artist;
    @XmlElement
    private Venue venue;

     getters / setters
}


@XmlRootElement(name = "Artists")
@XmlAccessorType(XmlAccessType.FIELD)
public class Artist {
    @XmlElement
    private long artistId;
    @XmlElement
    private long ticketMasterArtistId;
    @XmlElement
    private String name;
    @XmlElement
    private String url;
    @XmlElement
    private String imageUrl;
    @XmlElement
    private String category;
    @XmlElement
    private int categoryId;
    @XmlElement
    private String parentCategory;
    @XmlElement
    private int parentCategoryId;

           getters / setters
}

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Venue {
    @XmlElement
    private long venueId;
    @XmlElement
    private long ticketmasterVenueId;
    @XmlElement
    private String name;
    @XmlElement
    private String street;
    @XmlElement
    private String city;
    @XmlElement
    private String country;
    @XmlElement
    private String postcode;
    @XmlElement
    private String url;
    @XmlElement
    private String imageUrl;
    @XmlElement
    private String state;

    getters / setters
}

配置如下

<oxm:jaxb2-marshaller id="marshaller">
        <oxm:class-to-be-bound name="com.bb.tickets.ticketmaster.FindEvents"/>
    </oxm:jaxb2-marshaller>

    <bean id="webServiceTemplate" 
        class="org.springframework.ws.client.core.WebServiceTemplate">
        <property name="marshaller" ref="marshaller" />
        <property name="unmarshaller" ref="marshaller" />
        <property name="defaultUri"
            value="http://ticketmaster.productserve.com/v2/soap.php" />

    </bean>

發送請求和接收響應的代碼

SortTicket sortTicket = new SortTicket();
Request request = new Request();
request.setApiKey("APIKEY");
request.setCountry("UK");
FindEvents findEvents = new FindEvents();
findEvents.setRequest(request);
FindEventsResponse response = (FindEventsResponse) 
webServiceTemplate.marshalSendAndReceive(findEvents);
System.err.println("response:"+ 
response.getReturnResult().getDetails().getCurrentPage());  

從堆棧跟蹤中,我了解到JAX-B收到了marshall類型的FindEventsResponsefindEventsResponse ,但它期望使用FindEvents對象。

問題出在您的spring配置中。 您只告訴Spring, FindEvents類應該綁定到編組器。 您還需要使用classesToBeBound屬性添加FindEventsResponse類:

<oxm:jaxb2-marshaller id="marshaller">
    <property name="classesToBeBound">
        <list>
            <value>com.bb.tickets.ticketmaster.FindEvents</value>
            <value>com.bb.tickets.ticketmaster.FindEventsResponse</value>
        </list>
    </property>
</oxm:jaxb2-marshaller>

您也可以使用packageToScan屬性綁定一個包,請檢查此問題

希望能做到。

[編輯]:如果不起作用,請嘗試:

<oxm:jaxb2-marshaller id="marshaller">
    <oxm:class-to-be-bound name="com.bb.tickets.ticketmaster.FindEvents"/>
    <oxm:class-to-be-bound name="com.bb.tickets.ticketmaster.FindEventsResponse"/>
</oxm:jaxb2-marshaller>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM