Tutorial/Java 与 Spring Boot

在 Java 与 Spring Boot 中使用汇率

使用 RestClient、BigDecimal、环境变量认证与明确的新鲜度字段构建带类型的 Spring Boot 汇率客户端。

MMexchangerate.dev·Jul 17, 2026·6 分钟阅读

Spring RestClient 可以把 exchangerate.dev JSON 直接映射为 Java record。汇率使用 BigDecimal,API 密钥从配置注入,并保留 sourcemarket_sessiondata_updated_at

Key points
使用 Spring RestClient 构建同步、带类型的客户端。
BigDecimal 表示汇率与金额。
EXCHANGERATE_API_KEY 加载密钥。
data_updated_at 与汇率一同保存。

创建带类型的 RestClient

下面的 record 保留汇率映射以及解释汇率所需的字段。Jackson 通过 @JsonProperty 映射 snake_case 名称,Spring 负责请求和 JSON 解码。

java · ExchangeRateClient.javacopy
package com.example.fx;

import com.fasterxml.jackson.annotation.JsonProperty;
import java.math.BigDecimal;
import java.time.Instant;
import java.util.Map;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClient;

record LatestRates(
    String base,
    String source,
    @JsonProperty("market_session") String marketSession,
    @JsonProperty("data_updated_at") Instant dataUpdatedAt,
    Map<String, BigDecimal> rates
) {}

@Component
public final class ExchangeRateClient {
  private final RestClient client;

  public ExchangeRateClient(
      RestClient.Builder builder,
      @Value("${exchangerate.api-key}") String apiKey
  ) {
    this.client = builder
        .baseUrl("https://api.exchangerate.dev/v1")
        .defaultHeader(HttpHeaders.AUTHORIZATION, "Bearer " + apiKey)
        .build();
  }

  public LatestRates latest(String base) {
    return client.get()
        .uri("/latest/{base}?symbols=EUR,GBP", base)
        .retrieve()
        .body(LatestRates.class);
  }
}

从环境变量加载密钥

yaml · application.yamlcopy
exchangerate:
  api-key: ${EXCHANGERATE_API_KEY}

明确处理新鲜度与错误

RestClient.retrieve() 默认会对 4xx 与 5xx 抛出异常。请设置有限的超时,并且只重试短暂故障。401 需要修正密钥;持续的 429 需要减少流量或提高限额。

计算过程保持 BigDecimal
将汇率与金额解析为 BigDecimal,采用明确的舍入规则,并且只在最终展示目标货币时舍入。API 汇率保持完整精度。
  • 复用一个已配置的 RestClient。
  • 设置连接与读取超时。
  • 只缓存成功响应。
  • 保存 source、marketSession 与 dataUpdatedAt。
MM
exchangerate.dev
面向使用外汇数据的开发者的集成指南。

Keep reading

Guide一次获取历史外汇时间序列Read Reference读取 source 与 market_sessionRead Guide指示性汇率与可执行汇率Read