UnmarshallingFailureException:JAXB解组异常;嵌套的异常是javax.xml.bind.UnmarshalException [英] UnmarshallingFailureException: JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException

查看:168
本文介绍了UnmarshallingFailureException:JAXB解组异常;嵌套的异常是javax.xml.bind.UnmarshalException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试发送SOAP请求并通过WebServiceTemplate接收响应,但是我收到以下异常:

I am trying to send a SOAP request and receive the response by WebServiceTemplate but I am receiving following exception:

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>

发送请求和接收响应的代码

The code to send the request and receive response

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收到了类型为FindEventsResponse findEventsResponse ,以进行编组,但它期望FindEvents对象.

From the stack trace, I understand that JAX-B received a findEventsResponse of type FindEventsResponse to marshall but it expected a FindEvents object.

问题出在您的spring配置中.您只告诉Spring FindEvents类应该绑定到编组器.您还需要使用 classesToBeBound 属性添加FindEventsResponse类:

The issue lies within your spring configuration. You only told Spring that the FindEvents class should be bound to your marshaller. You need to add the FindEventsResponse class too, using the classesToBeBound property :

<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 属性绑定软件包,选中此

You could also bound a package using the packageToScan property, check this question.

希望做到这一点.

:如果不起作用,请尝试:

: if it doesn't work simply try :

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

这篇关于UnmarshallingFailureException:JAXB解组异常;嵌套的异常是javax.xml.bind.UnmarshalException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆