You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不同环境下罗马尼亚货币ROL-RON返回异常的Java Spring Boot问题咨询

问题复现背景

你基于Java Spring Boot开发的货币项目使用如下代码查询货币符号:

String currencyCode = "0946";
Optional<Currency> currency = Currency.getAvailableCurrencies().stream().filter(c -> c.getNumericCode() == Integer.parseInt(currencyCode)).findAny();
String currencySymbol = currency.get().getSymbol(Locale.getDefault());

你使用openjdk:8-alpine作为运行环境,测试环境可正确返回罗马尼亚新货币代码RON,但罗马尼亚当地用户运行时返回旧货币代码ROL。

核心原因
  • JRE内置货币元数据版本不足:罗马尼亚2005年推进货币改革,旧货币列伊(ROL)和新列伊(RON)的ISO 4217数字代码均为946,Java java.util.Currency的货币映射规则完全依赖JRE内置的区域数据文件。你使用的openjdk:8-alpine镜像为了压缩体积,默认内置精简版区域元数据,旧版本镜像未收录罗马尼亚货币改革的更新,默认将数字代码946映射为ROL。
  • 精简镜像缺失完整区域数据模块:标准OpenJDK 8包含完整的localedata模块,openjdk:8-alpine默认裁剪了该模块,仅保留基础区域配置。当运行环境默认Locale为罗马尼亚本地的ro_RO时,精简的区域数据会回退到旧货币配置,返回ROL而非更新后的RON。
  • 代码完全依赖JRE内置区域数据:代码直接调用JDK内置Currency类查询符号,没有自主维护货币映射规则,也没有指定更新的货币数据源,完全受JRE内置数据版本约束。
可选修复方案
  • 在Dockerfile中为openjdk:8-alpine安装完整区域数据包,添加指令:RUN apk add --no-cache openjdk8-jre-lib,该包包含完整的localedata模块,可覆盖精简版的旧区域数据。
  • 升级OpenJDK 8到最新小版本,或手动更新JRE内置的tzdata与货币元数据到最新版本。
  • 代码层面自主维护ISO 4217货币映射表,直接根据数字代码匹配货币符号,避免依赖JRE内置的可变区域数据。

内容的提问来源于stack exchange,提问作者İlkay Gunel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:45:00