java – RestTemplate无法填充对象

前端之家收集整理的这篇文章主要介绍了java – RestTemplate无法填充对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有以下代码发送请求并收到响应,似乎所有内容都已配置但代码返回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 List

例外

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)

样本结果

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());
            }
最佳答案
我能够让Spring的RestTemplate与SeatWave’s API一起工作

这是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文件,如下所示:

>创建一个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 of eventResponse.getEvents().getEvent().size().

猜你在找的Spring相关文章