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

Spring打印application.yml的chassis.cache配置段报错,求原因及正确方法

问题描述

我的application.yml配置如下:

chassis:
  cache:
    type: redis
    redis:
      serializer: json
      cacheNullValues: true

我希望打印出chassis.cache下的内容,格式如下:

type: redis
redis:
  serializer: json
  cacheNullValues: true

我写了如下代码:

@Component
public class Operation1  {
    @Value("${chassis.cache}")
    private Object cacheConfig;
    ...
    public handle(){
        LOG.info("Cache config is: {}", cacheConfig.toString());
    }
}

但运行时报错:

Error creating bean with name 'Operation1': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'chassis.cache' in value \"${chassis.cache}\"","class":"org.springframework.beans.factory.UnsatisfiedDependencyException","hash":"14cb5ff7"

请问这种实现方式是否正确?问题出在哪里?


问题分析与解决

这种实现方式不正确,问题根源如下:

  1. @Value注解仅支持注入单一简单类型的配置值(如字符串、数字、布尔值),无法直接处理chassis.cache这类包含子节点的嵌套配置树。Spring无法解析这个占位符,因为它不是一个可直接读取的单一值。
  2. 即便能注入,用Object类型接收也无法按你期望的YAML格式输出内容。

推荐两种正确实现方式:

方式一:用@ConfigurationProperties绑定配置类

通过定义与配置结构匹配的Java类,让Spring自动绑定配置内容:

  1. 定义配置类:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "chassis.cache")
public class CacheProperties {
    private String type;
    private RedisConfig redis;

    // 内部类对应redis子节点
    public static class RedisConfig {
        private String serializer;
        private boolean cacheNullValues;

        // getter、setter方法
        public String getSerializer() { return serializer; }
        public void setSerializer(String serializer) { this.serializer = serializer; }
        public boolean isCacheNullValues() { return cacheNullValues; }
        public void setCacheNullValues(boolean cacheNullValues) { this.cacheNullValues = cacheNullValues; }
    }

    // getter、setter方法
    public String getType() { return type; }
    public void setType(String type) { this.type = type; }
    public RedisConfig getRedis() { return redis; }
    public void setRedis(RedisConfig redis) { this.redis = redis; }

    // 重写toString方法,输出期望格式
    @Override
    public String toString() {
        return "type: " + type + "\n" +
                "redis:\n" +
                "  serializer: " + redis.getSerializer() + "\n" +
                "  cacheNullValues: " + redis.isCacheNullValues();
    }
}
  1. 在业务类中注入并打印:
@Component
public class Operation1  {
    private final CacheProperties cacheProperties;

    // 构造方法注入(Spring推荐方式)
    public Operation1(CacheProperties cacheProperties) {
        this.cacheProperties = cacheProperties;
    }

    public void handle(){
        LOG.info("Cache config is:\n{}", cacheProperties.toString());
    }
}

方式二:通过Environment手动读取配置项

如果不想定义配置类,可以直接用Environment逐个读取配置节点,再拼接格式:

import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Component
public class Operation1  {
    private final Environment environment;

    public Operation1(Environment environment) {
        this.environment = environment;
    }

    public void handle(){
        String type = environment.getProperty("chassis.cache.type");
        String serializer = environment.getProperty("chassis.cache.redis.serializer");
        String cacheNullValues = environment.getProperty("chassis.cache.redis.cacheNullValues");
        
        String cacheConfigStr = String.format("type: %s\nredis:\n  serializer: %s\n  cacheNullValues: %s",
                type, serializer, cacheNullValues);
        LOG.info("Cache config is:\n{}", cacheConfigStr);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:31:01