首页 > 解决方案 > 将 key->values (variableName->system environment value) 的映射从 application.properties 注入到具有默认值的映射对象

问题描述

application.properties我有这样的地图:

variable.map={variableName1: '${VARIABLE_VALUE_1}', variableName2: '${VARIABLE_VALUE_2}'}

VARIABLE_VALUE_1并且VARIABLE_VALUE_2来自系统环境变量。

我可以使用 SpEL 在我的配置类中非常简单地阅读它:

@Value("#{${variable.map}}")
private Map<String,String> variableMap;

因此,我得到了两个 map 条目variableMap。但是,如果其中一个不存在,我会在应用程序启动时遇到异常:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'VARIABLE_VALUE_1' in value "{variableName1: '${VARIABLE_VALUE_1}', variableName2: '${VARIABLE_VALUE_2}'}"

我该如何处理这个异常?例如,通过放置variableName1任何默认值或仅放置条目variableName2 -> VARIABLE_VALUE_2(所以如果系统环境变量不存在 -> 忽略它)?

标签: javaspring-boot

解决方案


如果您在值中使用参数,则取决于它们。因此,如果您声明两个参数,则两者都需要。

您可以尝试在一个参数中声明整个地图,这样您就更加灵活(但我不确定这是否有效)。即使你没有那个参数,你也可以声明使用 null 来代替。

variable.map=${VARIABLE_VALUE:#{null}}

并将您的价值声明为:

VARIABLE_VALUE = "{'variableName1': 'value1', 'variableName2': 'value2'}"

推荐阅读