Tutorial/Java 同 Spring Boot

喺 Java 同 Spring Boot 攞匯率

用 RestClient、BigDecimal、環境變數認證同埋清清楚楚嘅新鮮度欄位,整一個有類型嘅 Spring Boot 匯率客戶端。

ERexchangerate.dev·Jul 17, 2026·6 分鐘閱讀

Spring RestClient 可以將 exchangerate.dev 嘅 JSON 直接映射去 Java record。匯率用 BigDecimal,密鑰由設定度注入,仲要保留 sourcemarket_sessiondata_updated_at

Key points
用 Spring RestClient 整一個同步、有類型嘅客戶端。
BigDecimal 表示匯率同金額。
EXCHANGERATE_API_KEY 攞密鑰,絕對唔好提交去屬性檔案度。
data_updated_at 同匯率一齊儲存。

整一個有類型嘅 RestClient

record 保留咗匯率映射同解讀所需嘅欄位。Jackson 用 @JsonProperty 映射 snake_case 名,Spring 就負責 HTTP 同 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,用清清楚楚嘅四捨五入規則,淨係喺最後展示目標貨幣嗰陣先四捨五入。
  • 重用一個已經設定好嘅 RestClient。
  • 設定連線同讀取逾時。
  • 淨係快取成功嘅回應。
  • 保存 source、marketSession 同 dataUpdatedAt。
ER
exchangerate.dev
為用緊外匯數據嘅開發者而設嘅整合指南。

延伸閱讀

Guide一次過攞歷史外匯時間序列閱讀 Reference點讀 source 同 market_session閱讀 Guide指示性匯率同可執行匯率閱讀
更多比較Fixer vs exchangerate.devOpen Exchange Rates vs exchangerate.devCurrencylayer vs exchangerate.dev
學習Reading source and market_session in your pipelineIndicative vs executable FX rates: what a rates API actually gives youECB reference rates, explained
即時匯率EUR/USDGBP/USDUSD/JPY