【问题标题】:RestTemplate mapping to Map instead of fieldsRestTemplate 映射到 Map 而不是字段
【发布时间】:2017-12-21 19:20:46
【问题描述】:

我编写了简单的货币转换器,它从 Web 服务读取 JSON 并在网站上以选定的比率准备表格。

直到现在,我的 Rates 类都有每个比率的字段,但我决定将其更改为 Map。我使用Map 重写了整个课程,但RestTemplate 无法将JSON 数据映射到我的HashMap。整个字段被视为null。 如何重新配置​​RestTemplateObjectMapper 以启用映射JSONMap

Example JSON string that I am trying to map

我用来读取JSON 并将其映射到对象的存储库类: 包 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;
    }
}

我使用 JSON 数据映射的货币类: 包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; 导入 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;
    }
}

【问题讨论】:

    标签: java json spring spring-mvc resttemplate


    【解决方案1】:

    它不会像现在这样工作。您不需要 Rates 类,您可以完全摆脱它并使用:

    private Map<String, Double> rates
    

    在货币类中。

    【讨论】:

    • 是的。我忘记了我正在映射的 JSON 的结构。这很容易解决。谢谢。
    猜你喜欢
    • 2019-12-24
    • 2020-07-23
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多