我正试图在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应该正确地从特定于环境的配置文件加载属性。