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

Spring Boot中Controller无法读取application.yml的List属性问题

问题原因与解决方案

问题根源

@Value注解仅支持注入简单类型(基本类型、String)或结构简单的集合(比如逗号分隔的字符串列表),无法直接解析application.yml中嵌套的自定义对象列表(List<Topic>)。

当你使用@Value("${application.topics}")时,Spring会尝试将application.topics对应的配置当作单个字符串占位符解析,但实际该配置是多层嵌套的对象数组,Spring无法直接将其映射为List<Topic>,因此抛出"无法解析占位符"的错误。

而@ConfigurationProperties是Spring专为复杂配置绑定设计的注解,支持递归解析嵌套配置结构,能正确将application.topics绑定到包含List<Topic>的Java对象上,所以配置类方式可以正常工作。

修复方案

方案一:使用@ConfigurationProperties(推荐)

恢复你注释掉的配置类绑定方式,步骤如下:

  1. 定义封装List<Topic>的配置类:
@Data
@ConfigurationProperties(prefix = "application")
public class TopicsConfig {
    private List<Topic> topics;
}
  1. 在启动类或配置类上添加@EnableConfigurationProperties(TopicsConfig.class),或者直接在TopicsConfig类上添加@Component注解,使其成为Spring Bean。
  2. 在Controller中注入该配置类:
@Controller
@RequiredArgsConstructor
public class IndexController {
    private final TopicsConfig topicsConfig;

    // 使用时通过topicsConfig.getTopics()获取列表
}

方案二:修改配置格式配合@Value(不推荐,仅适用于简单场景)

如果一定要用@Value,需将配置改为字符串格式后手动解析,这种方式扩展性差,仅适合简单场景:

  1. 修改application.yml:
application:
  topics: "0:first topic,1:second topic"
  1. 在Controller中解析字符串为List<Topic>:
@Controller
public class IndexController {
    private List<Topic> topics;

    @Value("${application.topics}")
    public void setTopics(String topicsStr) {
        topics = Arrays.stream(topicsStr.split(","))
                .map(item -> {
                    String[] parts = item.split(":");
                    Topic topic = new Topic();
                    topic.setId(Integer.parseInt(parts[0]));
                    topic.setTopic(parts[1]);
                    return topic;
                })
                .collect(Collectors.toList());
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:32:46