加载配置属性时出错

时间:2019-07-27 06:59:31

标签: spring-boot consul

在我的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>]

如何以更简洁的方式在两个环境中加载配置?

1 个答案:

答案 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的默认优先级行为,以加载特定配置/类的外部配置