Problem z odczytem danych z json - RestTemplate

0

Witam,
Mam problem z Rest Template, ponizej podaje kod:

@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class ExchangeModel {
    @JsonProperty ("rates")
private Map<String, Double> rates;
    @JsonProperty("base")
private String base;
    @JsonProperty("date")
private String date;
}
public class Main {
    public static void main(String[] args) {
        new ExchangeGUI();
        List<String> list;
        RestTemplate rs = new RestTemplate();
        String url = "https://api.exchangeratesapi.io/latest";
        ExchangeModel res = rs.getForObject(url, ExchangeModel.class, new HashMap<>());
        list = new ArrayList<>(res.getRates().keySet());
        list.forEach(System.out::println);
    }
}

Wyrzuca mi blad :

Exception in thread "main" org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [class pl.kurs.java.exchange.model.ExchangeModel] and content type [application/json]
	at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:126)
	at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:777)
	at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:731)
	at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:342)
0
  1. Jaki masz JSON który chcesz zmapować?
    Znam to API i wiem że Twój model jest błędny
  2. Do reprezentowania kwot stosujemy BigDecimal!
0

@scibi92: chce wyciagnac z tego API liste walut, gdzie jest błąd jesli moglbys powiedziec, jak powinien prawidlowo wygladac ?

0

Coś mi się kolejność parametrów getForObject() nie zgadza, typ odpowiedzi jest przekazywany jako body requestu?

0

Dobra, pomyliło mi się, poza błędnym stosowaniem typów np. data jako strony wygląda chyba ok.
Po co stosujesz @JsonProperty jak masz już gettery i settery z lomboka? Nawalasz adnotacje i nie wiesz co robisz...
Spróbuj zmapować samego JSONa objectmapperem bez RestTemplate i zobacz co się stanie

0

Dodaj HttpHeaders. Po co ta new HashMap<>()) na koncu rs.getForObject?

5
  1. Wywal RestTemplate
  2. Użyj javowego HttpClient
  3. Użyj bezpośrednio ObjectMappera
  4. Profit!
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Map;

class ExchangeModel {
    private Map<String, Double> rates;
    private String base;
    private String date;

    public Map<String, Double> getRates() {
        return rates;
    }


    public String getBase() {
        return base;
    }

    public String getDate() {
        return date;
    }
}


public class Exchange {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpClient client = HttpClient.newBuilder().build();
        ObjectMapper objectMapper = new ObjectMapper();
        HttpResponse<InputStream> response = client.send(
                HttpRequest.newBuilder()
                        .GET()
                        .uri(URI.create("https://api.exchangeratesapi.io/latest"))
                        .build(),
                HttpResponse.BodyHandlers.ofInputStream()
        );
        ExchangeModel value = objectMapper.readValue(response.body(), ExchangeModel.class);
    }
}

I cyk, żadnych adnotacji, żadnego springa, żadnych błędów nie wiadomo skąd!

0

@Shalom: dziękuje bardzo, działa, o to chodziło :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1