在我的spring-boot 2应用程序中,我具有application.yml,
limitsconf:
limits:
- api: PUBLISH
valueType: REQUEST
serviceName: default
time:
HOURLY: 10
MINUTE: 10000
我的配置类是
@ConfigurationProperties(prefix = "limitsconf")
public class DefaultRateLimitsConfig {
private static final Logger logger =
LoggerFactory.getLogger(DefaultRateLimitsConfig.class);
private List<DefaultLimit> limits = new ArrayList<>();
public static class DefaultLimit {
String api;
String valueType;
String serviceName;
Map<String,Long> time;
}
}
该代码在本地计算机上运行良好,并且所有值均按预期加载。 但是云环境顾问将yml文件序列化为环境变量,因此我的配置表示为
key=limitsconf_limits value= [api:PUBLISH, valueType:REQUEST, serviceName:default, time:[HOURLY:10, MINUTE:10000]]
是一个字符串。我不知道领事代表哪种格式/将值序列化。现在我的DefaultRateLimitsConfig无法加载,因为它给出了错误,
Reason: No converter found capable of converting from type [java.lang.String] to type [java.util.List<DefaultRateLimitsConfig$DefaultLimit>]
如何以更简洁的方式在两个环境中加载配置?
答案 0 :(得分:0)
了解原因和非常糟糕的解决方法。领事将application.yml值存储在名为“ limitsconf_limits”的环境变量中。我能够使用env命令找到它。因此,根据spring-boot https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html的外部配置,OS env变量的优先级高于yml文件,因此出现错误“找不到能够从[java.lang.String]类型转换的转换器...”作为OS env变量是一个字符串。
解决方法是:我将密钥的值作为JSON字符串存储在yml文件中,并使用fastxml的ObjectMapper类对其进行了解析。 但是我不知道是否有任何方法可以覆盖Springboot的默认优先级行为,以加载特定配置/类的外部配置