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

Spring Boot如何从application.yml加载Java Money API类型货币金额配置

解决方法

Spring Boot默认的配置属性绑定逻辑没有内置Java Money API类型的转换器,且Money为不可变类、无对应setter方法,无法通过默认的反射属性注入完成绑定,只需自定义配置绑定转换器即可实现直接注入:

1. 引入依赖

首先确认已引入Java Money API的实现依赖,以Maven为例:

Spring Boot 2.x(对应javax.money)

<dependency>
    <groupId>org.javamoney</groupId>
    <artifactId>moneta</artifactId>
    <version>1.4.2</version>
    <type>pom</type>
</dependency>

Spring Boot 3.x(对应jakarta.money)

<dependency>
    <groupId>org.javamoney</groupId>
    <artifactId>moneta-core</artifactId>
    <version>2.0</version>
</dependency>

2. 自定义配置绑定转换器

新增转换器类,添加@ConfigurationPropertiesBinding注解标记为配置绑定专用转换器,将yml解析生成的结构Map直接转换为Money实例:

import org.javamoney.moneta.Money;
import org.springframework.boot.context.properties.ConfigurationPropertiesBinding;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.Map;
import java.util.Objects;

@Component
@ConfigurationPropertiesBinding
public class MoneyConfigConverter implements Converter<Map<String, Object>, Money> {
    @Override
    public Money convert(Map<String, Object> source) {
        BigDecimal amount = new BigDecimal(Objects.requireNonNull(source.get("value")).toString());
        String currencyCode = Objects.requireNonNull(source.get("currency")).toString();
        return Money.of(amount, currencyCode);
    }
}

3. 直接在配置类中使用Money类型

无需自定义封装类,直接声明Money类型属性即可完成绑定:

import org.javamoney.moneta.Money;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties
public class AppFinanceProperties {
    private Money financeAmt;

    public Money getFinanceAmt() {
        return financeAmt;
    }

    public void setFinanceAmt(Money financeAmt) {
        this.financeAmt = financeAmt;
    }
}

注意事项

  • 启动类需添加@EnableConfigurationProperties(AppFinanceProperties.class)注解,或给配置类添加@Component注解确保被Spring扫描到
  • 可根据业务需要在转换器中添加格式校验、空值处理等逻辑

内容的提问来源于stack exchange,提问作者Vikas Verma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:45:04