我有以下代码发送请求并收到响应,似乎所有内容都已配置但代码返回NullPointerException.
我不确定丢失了什么.我打印出了具有正确URL地址的readyURL变量. stackTrace提供的不多.
码
try {
final String APIKEY = "MYAPI";
final String URL = "http://api-sandBox.seatwave.com/v2/discovery/events?apikey="
+ APIKEY;
String readyUrl = URL + "&what=" + name;
RestTemplate restTemplate = new RestTemplate();
EventsResponse eventResponse = restTemplate.getForObject(readyUrl,EventsResponse.class);
System.err.println("seatwave>>>"
+ eventResponse.getEvents().getEvent().size()); //line 245
} catch (NullPointerException e) {
e.printstacktrace();
}
@XmlRootElement
@XmlAccessorType(XmlAccesstype.FIELD)
public class EventsResponse {
@XmlElement
private Status status;
@XmlElement(name = "Paging")
private Page page;
@XmlElement
private Events events;
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
public Page getPage() {
return page;
}
public void setPage(Page page) {
this.page = page;
}
public Events getEvents() {
return events;
}
public void setEvents(Events events) {
this.events = events;
}
}
@XmlRootElement
@XmlAccessorType(XmlAccesstype.FIELD)
public class Status {
@XmlElement(name = "Version")
private double version;
@XmlElement(name = "TimeStamputc")
private Date timeStamputc;
@XmlElement(name = "Code")
private int code;
@XmlElement(name = "Message")
private String message;
@XmlElement(name = "Details")
private String details;
public double getVersion() {
return version;
}
public void setVersion(double version) {
this.version = version;
}
public Date getTimeStamputc() {
return timeStamputc;
}
public void setTimeStamputc(Date timeStamputc) {
this.timeStamputc = timeStamputc;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
}
@XmlRootElement(name="Page")
@XmlAccessorType(XmlAccesstype.FIELD)
public class Page {
@XmlElement(name="PageNumber")
private int pageNumber;
@XmlElement(name="PageSize")
private int pageSize;
@XmlElement(name="PageResultCount")
private int pageResultCount;
@XmlElement(name="TotalResultCount")
private int totalResultCount;
@XmlElement(name="TotalPageCount")
private int totalPageCount;
public int getPageNumber() {
return pageNumber;
}
public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageResultCount() {
return pageResultCount;
}
public void setPageResultCount(int pageResultCount) {
this.pageResultCount = pageResultCount;
}
public int getTotalResultCount() {
return totalResultCount;
}
public void setTotalResultCount(int totalResultCount) {
this.totalResultCount = totalResultCount;
}
public int getTotalPageCount() {
return totalPageCount;
}
public void setTotalPageCount(int totalPageCount) {
this.totalPageCount = totalPageCount;
}
}
@XmlRootElement
@XmlAccessorType(XmlAccesstype.FIELD)
public class Events {
@XmlElement
private Listsstype.FIELD)
public class Event {
@XmlElement(name = "Id")
private int id;
@XmlElement(name = "Date")
private Date date;
@XmlElement(name = "EventGroupName")
private String eventGroupName;
@XmlElement(name = "VenueName")
private String venueName;
@XmlElement(name = "Town")
private String town;
@XmlElement(name = "Country")
private String country;
@XmlElement(name = "TicketCount")
private int ticketCount;
@XmlElement(name = "Currency")
private String currency;
@XmlElement(name = "MinPrice")
private double minPrice;
@XmlElement(name = "SwURL")
private String swUrl;
@XmlElement(name = "EventGroupImageURL")
private String eventGroupImageUrl;
@XmlElement(name = "LayoutId")
private int layoutId;
@XmlElement(name = "EventGroupId")
private int eventGroupId;
@XmlElement(name = "VenueId")
private int venueId;
@XmlElement(name = "SwSellURL")
private String swSellUrl;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getEventGroupName() {
return eventGroupName;
}
public void setEventGroupName(String eventGroupName) {
this.eventGroupName = eventGroupName;
}
public String getVenueName() {
return venueName;
}
public void setVenueName(String venueName) {
this.venueName = venueName;
}
public String getTown() {
return town;
}
public void setTown(String town) {
this.town = town;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public int getTicketCount() {
return ticketCount;
}
public void setTicketCount(int ticketCount) {
this.ticketCount = ticketCount;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
public double getMinPrice() {
return minPrice;
}
public void setMinPrice(double minPrice) {
this.minPrice = minPrice;
}
public String getSwUrl() {
return swUrl;
}
public void setSwUrl(String swUrl) {
this.swUrl = swUrl;
}
public String getEventGroupImageUrl() {
return eventGroupImageUrl;
}
public void setEventGroupImageUrl(String eventGroupImageUrl) {
this.eventGroupImageUrl = eventGroupImageUrl;
}
public int getLayoutId() {
return layoutId;
}
public void setLayoutId(int layoutId) {
this.layoutId = layoutId;
}
public int getEventGroupId() {
return eventGroupId;
}
public void setEventGroupId(int eventGroupId) {
this.eventGroupId = eventGroupId;
}
public int getVenueId() {
return venueId;
}
public void setVenueId(int venueId) {
this.venueId = venueId;
}
public String getSwSellUrl() {
return swSellUrl;
}
public void setSwSellUrl(String swSellUrl) {
this.swSellUrl = swSellUrl;
}
}
例外
java.lang.NullPointerException
at com.myproject.tickets.service.TicketSeviceImpl.seatWave(TicketSeviceImpl.java:245)
at com.myproject.tickets.service.TicketSeviceImpl.findTicket(TicketSeviceImpl.java:45)
at com.myproject.web.TicketController.findTicket(TicketController.java:29)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.invocableHandlerMethod.doInvoke(invocableHandlerMethod.java:221)
at org.springframework.web.method.support.invocableHandlerMethod.invokeForRequest(invocableHandlerMethod.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletinvocableHandlerMethod.invokeAndHandle(ServletinvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.dispatcherServlet.dodispatch(dispatcherServlet.java:943)
at org.springframework.web.servlet.dispatcherServlet.doService(dispatcherServlet.java:877)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:369)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:112)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.authentication.logout.logoutFilter.doFilter(logoutFilter.java:105)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:168)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
样本结果
mputc>2015-09-27T08:44:24mputc>
diotdiot-tickets/arts-theatre-tickets/27-september-2015/perf/987509?affid=&appid=2037810diot_32152_1_1_20111209091615.jpg
更新
我在restTemplate.getForObject行之后添加了此代码,但控制台上不会显示任何内容.
if(eventResponse == null)
{
System.err.println("it is null");
}else{
System.err.println("message:>>"+eventResponse.getStatus().getMessage());
}
这是github上的一个工作示例:https://github.com/cosbor11/seatwave-spring-client-example
以下是步骤:
>在浏览器中输入以下GET URL:
http://api-sandbox.seatwave.com/v2/discovery/events?apikey=4739E4694D0E482A92C9D0B478D83934&what=music
>查看源并将xml复制粘贴到xsd generator中.
>选择俄罗斯娃娃样式生成xsd.
>将生成的内容粘贴到位于以下位置的新文件中:${home} /Desktop/schema.xsd.
>如果它看起来像这样删除第一行:<?xml version =“1.0”encoding =“utf-16”?>
>创建一个binding.xml文件,如下所示:
scoping="toplevel"/>
>创建一个src文件:mkdir src.
>使用XJC将Java Jaxb类生成到该文件夹中,如下所示:
xjc -b~ / Desktop / binding.xml -d src -p com.yourcompany~ / Desktop / schema.xsd
>确保将生成的类和包结构复制到构建路径中.
>此外,在构建路径中,使用使用RestTemplate的main方法创建一个类:
public static void main(String args[])
{
try
{
String name = "music";
final String APIKEY = "4739E4694D0E482A92C9D0B478D83934"; //http://api-sandBox.seatwave.com/v2/discovery/events?apikey=4739E4694D0E482A92C9D0B478D83934&what=music
final String URL = "http://api-sandBox.seatwave.com/v2/discovery/events?apikey=" + APIKEY;
String readyUrl = URL + "&what=" + name;
RestTemplate restTemplate = new RestTemplate();
EventsResponse eventResponse = restTemplate.getForObject(readyUrl,EventsResponse.class);
System.err.println("seatwave>>>" + eventResponse.getEvents().getEvent().size());
}
catch (NullPointerException e)
{
e.printstacktrace();
}
}
>编译该类并运行main方法.在此示例中,您应该获得50条记录作为大小.请注意,即使将name变量更改为返回空集的内容,也不会有NullPointerExeption.
以下是生成的JAXB类的外观:
EventResponse.java:
@XmlAccessorType(XmlAccesstype.FIELD)
@XmlType(name = "",propOrder = {
"status","paging","events"
})
@XmlRootElement(name = "EventsResponse")
public class EventsResponse {
@XmlElement(name = "Status",required = true)
protected Status status;
@XmlElement(name = "Paging",required = true)
protected Paging paging;
@XmlElement(name = "Events",required = true)
protected Events events;
//getters & setters
Events.java:
@XmlAccessorType(XmlAccesstype.FIELD)
@XmlType(name = "",propOrder = {
"event"
})
public class Events {
@XmlElement(name = "Event",required = true)
protected List
Event.java:
@XmlAccessorType(XmlAccesstype.FIELD)
@XmlType(name = "",propOrder = {
"id","date","eventGroupName","venueName","town","country","ticketCount","currency","minPrice","swURL","eventGroupImageURL","layoutId","eventGroupId","venueId","swSellURL"
})
public class Event {
@XmlElement(name = "Id")
protected int id;
@XmlElement(name = "Date",required = true)
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar date;
@XmlElement(name = "EventGroupName",required = true)
protected String eventGroupName;
@XmlElement(name = "VenueName",required = true)
protected String venueName;
@XmlElement(name = "Town",required = true)
protected String town;
@XmlElement(name = "Country",required = true)
protected String country;
@XmlElement(name = "TicketCount")
protected int ticketCount;
@XmlElement(name = "Currency",required = true)
protected String currency;
@XmlElement(name = "MinPrice",required = true)
protected BigDecimal minPrice;
@XmlElement(name = "SwURL",required = true)
protected String swURL;
@XmlElement(name = "EventGroupImageURL",required = true)
protected String eventGroupImageURL;
@XmlElement(name = "LayoutId")
protected int layoutId;
@XmlElement(name = "EventGroupId")
protected int eventGroupId;
@XmlElement(name = "VenueId")
protected int venueId;
@XmlElement(name = "SwSellURL",required = true)
protected String swSellURL;
//getter & setters
Notes:
If you are using maven,there are some nifty tools to generate the jaxb classes into your
generated-sources
folder automatically. I recommend 07004.Notice that
Events#getEvent()
method returns a new List if the event property is null.The binding.xml file is handy for customizing the way your jaxb is generated,if you play around with it I bet you can figure out how to get the API classes to be interacted with in a more intuitive way. For example in you main class you Could get the size by calling
eventResponse.getEvents().size()
instead ofeventResponse.getEvents().getEvent().size()
.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。