Использование ответа RestTemplate API - PullRequest
0 голосов
/ 11 января 2019

Мне нужна такая же помощь. У меня есть класс POJO, мне нужно использовать API Starwar, взять результат и преобразовать его в объекты.

@JsonIgnoreProperties(ignoreUnknown = true)
public class Planeta {

private String name;
private String climate; 
private String terrain;



 Getters and Setters...

Application.java

package hello;


@SpringBootApplication
public class Application {

private static final Logger log = LoggerFactory.getLogger(Application.class);

public static void main(String args[]) {
    SpringApplication.run(Application.class);
}

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder.build();
}

@Bean
public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
    return args -> {
        Planeta planeta = restTemplate.getForObject("http://localhost:8080/planeta/name/terra", Planeta.class);

        log.info(planeta.getName());
    };
}
}

почему-то я получаю нулевые значения.

Результат URL API

{"data":[{"id":"5c378401c0ac520ffc670019","name":"terra","climate":"tropical","terrain":"earth"}],"erros":null}

Журналы

Application : Planeta [name=null, climate=null, terrain=null]

отредактирован;

Ответы [ 2 ]

0 голосов
/ 12 января 2019

API возвращает объект с ключом data, внутри которого находится не один массив планет. Вы ожидаете только один, без поля данных. JSON не соответствует ожидаемому классу Planeta.

0 голосов
/ 11 января 2019

Ответ JSON не соответствует POJO, ответ JSONObject с JsonArray (ключ = "данные"), а массив состоит из Planeta объектов

@JsonIgnoreProperties(ignoreUnknown = true)
public class Response{

 @JsonProperty("data")
 List<Planeta> data;

 }

Если у вас есть только один Planeta объект в List,

Planeta p = data.stream().findFirst().get();
System.out.println(p.getName());

Если у вас есть несколько объектов в List

за каждый

for(Planeta p :data) {
        System.out.println(p.getName());
        // same for climate and terrain
    }

Java-8

data.forEach(planeta-> System.out.println(planeta.getName()));
...