I’ve created a simple Spring Boot app, in which I am trying to consume an API through JSON information. Below you can see the simple code I created using RestTemplate on the Service Class. The problem I am facing is that when I am using the API url below, I am getting the following nested exception.
In case I am using API url with less information, everything works fine. What am I doing wrong?
CONTROLLER CLASS
package com.andrekreou.iot; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class RestSpringBootController { private final Service service; @Autowired public RestSpringBootController(Service service) { this.service = service; } @GetMapping(path = "/opap") public List<Object> getWeather(){ return service.getWeather(); } }
SERVICE CLASS
package com.andrekreou.iot; import org.springframework.web.client.RestTemplate; import java.util.Arrays; import java.util.List; @org.springframework.stereotype.Service public class Service { public List<Object> getWeather(){ String url = "https://api.opap.gr/draws/v3.0/5104/last-result-and-active"; RestTemplate restTemplate = new RestTemplate(); Object[] weather = restTemplate.getForObject(url, Object[].class); return Arrays.asList(weather); } }
Advertisement
Answer
The problem is in this line of code:
Object[] weather = restTemplate.getForObject(url, Object[].class);
You’re mapping this JSON :
{ "last": { "gameId": 5104, "drawId": 2446, "drawTime": 1653850800000, "status": "results", "drawBreak": 1800000, "visualDraw": 2446, "pricePoints": { "amount": 0.5 }, "winningNumbers": { "list": [ 1, 9, 19, 22, 33 ], "bonus": [ 1 ] }, ... }
Which is not array, it’s an object, and that’s why you are getting error described in your question.
Change above line of code to:
Object weather = restTemplate.getForObject(url, Object.class);
and it should work fine.