2017-12-21 1 views
0

웹 서비스에서 JSON을 읽고 선택한 비율로 웹 사이트에서 테이블을 준비하는 간단한 통화 변환기를 작성했습니다.RestTemplate을 매핑 대신 매핑하는 필드

지금까지 요금 클래스에는 각 비율에 대한 필드가 있었지만 Map으로 변경하기로 결정했습니다. Map을 사용하여 전체 수업을 다시 작성했지만 RestTemplate을 (를) JSON 데이터를 HashMap에 매핑 할 수 없습니다. 전체 필드는 null으로 간주됩니다. RestTemplate 또는 ObjectMapper을 매핑하여 JSON에서 Map으로 매핑하려면 어떻게해야합니까?

Example JSON string that I am trying to map

저장소 클래스 I는 JSON을 읽을 수 및 개체에 매핑하는 데 사용하고 있습니다 : 패키지 com.github.gromo13.currencyConverter.repository; 내가 JSON 데이터를 사용하여 매핑하고

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; 
    } 
} 

환율 클래스 : 패키지 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; 
    } 
} 
내가 매핑 할 수 없습니다입니다 Map

요금 클래스 (환율 클래스의 필드) : 패키지 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()); 
    } 
} 

내 실제 RestTemplate 구성 : 패키지 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; 
    } 
} 

답변

1

지금 가지고있는 방식대로 작동하지 않습니다. 당신은 당신이 완전히 제거하고 사용받을 수 있으며, Rates 클래스가 필요하지 않습니다 통화 클래스의

private Map<String, Double> rates 

합니다.

+0

예. 내가 매핑하는 JSON의 구조를 잊어 버렸다. 그렇게 쉽게 해결할 수있었습니다. 고맙습니다. – Gromo