2017-12-21 5 views
0

Ich habe einen einfachen Währungsrechner geschrieben, der JSON vom Webservice liest und die Tabelle auf der Website mit ausgewählten Verhältnissen erstellt.RestTemplate Zuordnung zu Map anstelle von Feldern

Bis jetzt hatte meine Klasse Preise Feld für jedes Verhältnis, aber ich entschied, es zu Map zu ändern. Ich schrieb die gesamte Klasse unter Verwendung Map um, aber RestTemplate kann JSON Daten meiner HashMap nicht zuordnen. Das gesamte Feld wird als null betrachtet. Wie kann ich RestTemplate oder ObjectMapper neu konfigurieren, um die Zuordnung JSON zu Map zu aktivieren?

Example JSON string that I am trying to map

Repository Klasse Ich bin mit JSON zu lesen und es auf dem Objekt zur Karte: Paket com.github.gromo13.currencyConverter.repository;

import com.github.gromo13.currencyConverter.model.Currency; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Repository; 
import org.springframework.web.client.RestTemplate; 

@Repository 
public class FixerIoCurrencyRepository implements CurrencyRepository { 
    @Autowired 
    private RestTemplate restTemplate; 

    public void setRestTemplate(RestTemplate restTemplate) { 
     this.restTemplate = restTemplate; 
    } 

    @Override 
    public Currency getCurrency(String currencyCode) { 
     Currency currency = restTemplate.getForObject("http://api.fixer.io/latest?base={currencyCode}", Currency.class, currencyCode); 

     return currency; 
    } 
} 

Währungsklasse I JSON-Daten am Mapping: Paket com.github.gromo13.currencyConverter.model;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Currency { 
    private String base; 
    private String date; 
    private Rates rates; 

    public String getBase() { 
     return this.base; 
    } 

    public void setBase(String base) { 
     this.base = base; 
    } 

    public String getDate() { 
     return this.date; 
    } 

    public void setDate(String date) { 
     this.date = date; 
    } 

    public Rates getRates() { 
     return this.rates; 
    } 

    public void setRates(Rates rates) { 
     this.rates = rates; 
    } 
} 

Preise Klasse (Feld in der Klasse Währung) mit Map, dass ich nicht in der Lage bin zur Karte: Paket com.github.gromo13.currencyConverter.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import java.util.HashMap; 
import java.util.Map; 

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Rates { 
    private Map<String, Double> rates = new HashMap<>(); 

    public void clear() { 
     rates.clear(); 
    } 

    public void setRate(String currencyCode, double rate) { 
     rates.put(currencyCode.toUpperCase(), rate); 
    } 

    public double getRate(String currencyCode) { 
     return rates.get(currencyCode.toUpperCase()); 
    } 
} 

Meine eigentliche RestTemplate Konfiguration: Paket com.github.gromo13.currencyConverter.config;

import com.fasterxml.jackson.databind.MapperFeature; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; 
import org.springframework.web.client.RestTemplate; 

@Configuration 
public class Config { 
    @Bean 
    public RestTemplate restTemplate() { 
     RestTemplate restTemplate = new RestTemplate(); 
     restTemplate.getMessageConverters().add(0, mappingJackson2HttpMessageConverter()); 

     return restTemplate; 
    } 

    @Bean 
    public ObjectMapper objectMapper() { 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); 

     return mapper; 
    } 

    @Bean 
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { 
     MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 
     converter.setObjectMapper(objectMapper()); 

     return converter; 
    } 
} 

Antwort

1

Es wird nicht so funktionieren, wie Sie es jetzt haben. Sie brauchen nicht die Rates Klasse, können Sie ganz loswerden es und verwenden:

private Map<String, Double> rates 

in der Währungsklasse.

+0

Ja. Ich habe die Struktur von JSON vergessen, die ich kartiere. Das war so einfach zu lösen. Vielen Dank. – Gromo

Verwandte Themen