无法使用环境变量实例化yaml变量列表:无法解析值中的占位符



我正试图在application.yaml文件的列表中设置一些环境变量,但我收到了以下错误消息:

java.lang.IollegalArgumentException:无法解析值中的占位符"SOME_ID"{SOME_ID}、${ANOTHER_ID}";

我的application.yaml文件中有以下值:

com:
foo:
product-ids: ${SOME_ID},${ANOTHER_ID}

其中这些值是在其他一些yaml文件中设置的,例如so:

application:
env: test
subEnv:
- name: SOME_ID
value: "foo"
- name: ANOTHER_ID
value: "bar"

我的服务如下:

@Service
public class Service {
private final List<String> productIds;
public Service(
@Value("#{'${com.foo.product-ids}'.split(',')}") List<String> productIds) {
this.productIds = productIds;
}
...
}

我的测试初始化程序看起来是这样的:

@ContextConfiguration(
classes = {Service.class},
initializers = {SpringBootComponentTest.Initializer.class})
@SpringBootTest(
webEnvironment = WebEnvironment.RANDOM_PORT,
classes = {Service.class})
@SpringJUnitConfig
@ActiveProfiles("test")
public abstract class SpringBootComponentTest {
protected static final String FIRST_VALUE = "abc";
protected static final String SECOND_VALUE = "xyz";
...
static class Initializer
implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
TestPropertyValues.of(
"com.foo.product-ids[0]=" + FIRST_VALUE,
"com.foo.product-ids[1]=" + SECOND_VALUE)
.applyTo(configurableApplicationContext.getEnvironment());
}
}
}

此外,如果我只是将变量引用替换为像这样的硬编码值,问题似乎就解决了

com:
foo:
product-ids: foo,bar

但这不是我正在寻找的解决方案;我希望能够将我的变量添加到此列表中。

编辑:这是我的application.yaml的大部分/相关数据

spring:
application:
name: my-service
server:
port: 8080
management:
endpoint:
metrics:
enabled: true
prometheus:
enabled: true
endpoints.web.exposure.include: "*"
server:
port: 9080
security:
enabled: false
metrics:
export:
prometheus:
enabled: true
distribution:
sla:
http.server.requests: ${CORE_COMMON_BACKEND_SLA:PT1S}
com:
foo:
product-ids: ${SOME_ID},${ANOTHER_ID}

编辑2:

我应该注意,如果我不使用列表,我可以很好地访问这些变量。

所以,如果我做了这样的事情:

com:
foo:
product-id1: ${SOME_ID}
proudct-id2: ${ANOTHER_ID}

并相应地修改代码,这是有效的,但我仍然不希望将其作为我的解决方案。

出于某种原因,引用我的products-ids列表中的变量似乎是个问题。。。

它与spring引导加载YAML配置文件的顺序有关。此处详细介绍

在您的情况下,订单13&15。

因此,您应该将特定于环境的配置文件命名为:applicationtest.yaml,就像您在测试用例中使用@ActiveProfiles("test"(一样。

然后您的应用程序.yaml应该正确地从特定于环境的配置文件加载属性。

相关内容

  • 没有找到相关文章

最新更新