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"
请问这种实现方式是否正确?问题出在哪里?
问题分析与解决
这种实现方式不正确,问题根源如下:
@Value注解仅支持注入单一简单类型的配置值(如字符串、数字、布尔值),无法直接处理chassis.cache这类包含子节点的嵌套配置树。Spring无法解析这个占位符,因为它不是一个可直接读取的单一值。- 即便能注入,用
Object类型接收也无法按你期望的YAML格式输出内容。
推荐两种正确实现方式:
方式一:用@ConfigurationProperties绑定配置类
通过定义与配置结构匹配的Java类,让Spring自动绑定配置内容:
- 定义配置类:
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(); } }
- 在业务类中注入并打印:
@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
相关产品推荐
相关产品推荐

