我在使用属性名称时遇到了 Spring Boot (3.1.3) 的一个奇怪行为-
。以下是示例代码:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@SpringBootTest
class DemoApplicationTests {
@Value("${application.jokeurl}")
private String jokeUrl;
@Value("${application.joke-url}")
private String jokeDashUrl;
@Test
void contextLoads() {
System.out.println(jokeUrl);
System.out.println(jokeDashUrl);
}
}
这是我的application.yml
:
application:
joke-url: url1 #pay attention to dash in property name
当我运行测试时,它会在控制台中打印两行:
url1
url1
我们看到,Spring 将相同的字符串注入到实际上引用不同属性的值中,即@Value("${application.jokeurl}")
和@Value("${application.joke-url}")
。
现在,如果我再添加一个属性到application.yml
as
application:
joke-url: url1 #pay attention to dash in property name
jokeurl: url2 #no dash in property name
相同的测试打印不同的行:
url2
url2
现在我们看到该属性application.joke-url
被忽略application.jokeurl
,并再次将相同的字符串注入到引用不同属性的值中。
所以我的问题是这是一个错误还是预期的行为?
Spring Boot 遵循的概念
Relaxed Binding
。该概念指出:在您的情况下,
application.joke-url
通过宽松绑定的属性变为application.jokeurl
。 属性的值joke-url
被jokeurl
属性替换,因为根据该概念,它们是相同的属性。这就是您面临这个问题的原因。
仅供参考: Spring Boot 不会抛出任何警告/错误,因为这是预期的行为。
解决方案:
诀窍在于不要对简单属性使用任何特殊字符。
使用camelcase。更改
jokeurl
为jokeUrl
即可解决您的问题。application.yml或application.yaml:
更新了 DemoApplicationTests:
输出 :
使用 JDK 21 和 Spring Boot 3.1.4 进行了测试。它可以正常工作。