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
相关产品推荐
相关产品推荐

