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

使用@ConfigurationProperties绑定Map时无法保留键的顺序

解决@ConfigurationProperties注入Map失败的问题

从你给出的代码片段来看,你在使用@ConfigurationProperties注入Map时大概率遇到了失效的问题,核心原因出在类的结构和属性修饰符上,我来帮你梳理并解决:

问题根源

  • 静态属性不被Spring支持注入:你的solitaireProp是static修饰的,而@ConfigurationProperties是作用于Spring管理的Bean实例属性的,Spring容器不会自动处理静态字段的注入逻辑。
  • 类未被Spring实例化:WebUtils用了私有构造方法,也没有标记为Spring组件(比如@Component),Spring无法创建这个类的实例,自然不会解析@ConfigurationProperties注解。

推荐解决方案:调整为Spring管理的Bean

下面是修改后的代码,让Spring能正确完成Map属性的注入:

1. 修改WebUtils类

@Component
@ConfigurationProperties(prefix = "product")
public class WebUtils {
    // 移除私有构造,让Spring可以实例化该类
    // private WebUtils() { }

    // 将静态属性改为实例属性
    private Map<String, String> solitaireProp = new LinkedHashMap<>();

    // 提供getter和setter(Spring通过setter注入属性,也可以用Lombok的@Setter简化代码)
    public Map<String, String> getSolitaireProp() {
        return solitaireProp;
    }

    public void setSolitaireProp(Map<String, String> solitaireProp) {
        this.solitaireProp = solitaireProp;
    }

    // 工具方法建议改为实例方法,后续通过注入WebUtils来调用
    public String getURLWithContextPath(HttpServletRequest request) {
        return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
    }
}

2. 在业务类中注入使用

@Service
public class YourBusinessService {
    private final WebUtils webUtils;

    // 构造注入(Spring推荐的依赖注入方式)
    public YourBusinessService(WebUtils webUtils) {
        this.webUtils = webUtils;
    }

    public void processSolitaireProps() {
        Map<String, String> props = webUtils.getSolitaireProp();
        // 在这里使用你的Map属性做业务逻辑处理
    }
}

备选方案:保留静态工具类风格(不推荐)

如果你一定要维持工具类的静态方法写法,可以通过@PostConstruct将Bean实例赋值给静态变量,但这种方式会耦合Spring上下文,不推荐在复杂项目中使用:

@Component
@ConfigurationProperties(prefix = "product")
public class WebUtils {
    private static WebUtils instance;

    private Map<String, String> solitaireProp = new LinkedHashMap<>();

    @PostConstruct
    private void initInstance() {
        instance = this;
    }

    public static String getURLWithContextPath(HttpServletRequest request) {
        return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
    }

    public static Map<String, String> getSolitaireProp() {
        return instance.solitaireProp;
    }

    public void setSolitaireProp(Map<String, String> solitaireProp) {
        this.solitaireProp = solitaireProp;
    }
}

补充配置说明

确保你的application.properties(或application.yml)中有对应的配置项,比如:

product.solitaireProp.key1=value1
product.solitaireProp.key2=value2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:50:50