SpringのRestClientはexchangerate.devのJSONをJava recordへ直接変換できる。レートはBigDecimalで保持し、キーは設定から注入し、source、market_session、data_updated_atを残す。
要点
同期の型付きクライアントにはSpring
RestClientを使う。レートと金額は
BigDecimalで扱う。キーは
EXCHANGERATE_API_KEYから読み、コミットされたプロパティファイルには決して置かない。レートとともに
data_updated_atを保存する。型付きRestClientを作る
次のrecordはレートのマップと解釈に必要なフィールドを保持する。Jacksonは@JsonPropertyでsnake_case名を割り当て、SpringがHTTPとJSON変換を担当する。
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);
}
}環境からキーを読み込む
exchangerate:
api-key: ${EXCHANGERATE_API_KEY}鮮度とエラーを明示的に扱う
RestClient.retrieve()は既定で4xxと5xxに例外を投げる。共有リクエストファクトリに有限のタイムアウトを設定し、一時的な障害だけを再試行する。401はキー修正、継続する429はトラフィック削減か上限変更が必要である。
計算中はBigDecimalを維持する
レートと金額を
BigDecimalとして解析し、明示した丸め規則で乗算し、対象通貨の表示時だけ丸める。APIレートは完全な精度を維持する。- 設定済みRestClientを再利用する。
- 接続と読み取りのタイムアウトを設定する。
- 成功レスポンスだけをキャッシュする。
- source、marketSession、dataUpdatedAtを保存する。
ER
exchangerate.dev
FXデータを扱う開発者向けの統合ガイド。
