I am using spring-boot 2.2.10.
This works:
@Data
@ConstructorBinding
@ConfigurationProperties(prefix = "someconfig")
public class SomeConfigProperties {
private final NestedProperties nested;
private final Integer value;
}
@Data
public class NestedProperties {
private final Integer value;
}
I can supply the property by having environment variables SOMECONFIG_NESTED_VALUE=1 SOMECONFIG_VALUE=1
while starting the app.
However, the below does not work (note the dash-delimited prefix):
@Data
@ConstructorBinding
@ConfigurationProperties(prefix = "some-config")
public class SomeConfigProperties {
private final NestedProperties nested;
private final Integer value;
}
@Data
public class NestedProperties {
private final Integer value;
}
With environment variables SOME_CONFIG_NESTED_VALUE=1 SOME_CONFIG_VALUE=1
during startup, I can only see the SomeConfigProperties#value
initialized to the correct 1
value, while SomeConfigProperties#nested
is set to null
.
After some debug and trace, I believe it starts to go wrong from:
https://github.com/spring-projects/spring-boot/blob/d005a64c9f99c280f19ad37e8deb64968c965729/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/source/ConfigurationPropertyName.java#L254
and
https://github.com/spring-projects/spring-boot/blob/d005a64c9f99c280f19ad37e8deb64968c965729/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/source/ConfigurationPropertyName.java#L328
Comment From: wilkinsona
Have you tried it without the -
, so using the same environment variables in both cases, as described in the documentation?
Comment From: gjgarryuan
Hey @wilkinsona, thanks for the response.
But my major concern is that, for the second case where the prefix is some-config
, SOME_CONFIG_VALUE=1
works for the non-nested value, while SOME_CONFIG_NESTED_VALUE=1
does not work for the nested value.
Comment From: gjgarryuan
Interestingly, I have always been mapping the -
in the property name to an _
in the environment variable and it always works...
Now that I know the rule of
Remove any dashes (-).
So is my current way of doing it (ie. mapping -
in property name to _
in environment variable) just accidentally supported (ie. never officially supported)?
If that is the case I guess this is not an issue any more.
Comment From: wilkinsona
Some support for mapping -
to _
was added in https://github.com/spring-projects/spring-boot/issues/10873. This was done to preserve backwards compatibility with Spring Boot 1.x but was focused on the property name rather than the prefix containing a -
.
I'll mark this one for team attention so that we can discuss expanding that to supporting -
mapping to _
in the prefix too. Irrespective of the outcome of that, I'd recommend following the documentation and removing -
characters.
Comment From: gjgarryuan
Thanks for the clarification!
I will follow the documented way of environment variable binding from now on.
Comment From: wilkinsona
We've discussed this today and agreed that we don't want to add any extra complexity to further support the undocumented -
to _
case. Instead, the translation should be performed as documented with -
characters being removed rather than replaced.