我有一个简单的Spring Boot项目,旨在从application.yml
读取和转换数据并将其转换为Java Map<String,String>
。在项目的业务层中,我需要使用电子邮件地址作为键来填充该地图。问题从这里开始。 Spring(或Spring Boot)无法正常运行。它完全忽略了键方面的@
个字符,但在值方面可以正常工作。
以下是一些代码:
Application.java
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Bootstrap.java
@Slf4j
@Component
@ConfigurationProperties(prefix = "foo-filter")
public class Bootstrap implements CommandLineRunner {
@Setter
private Map<String, String> barFilters;
@Setter
private Map<String, String> bazFilters;
@Override
public void run(String... args) {
barFilters.forEach((key, value) -> log.info(key + " -> " + value));
bazFilters.forEach((key, value) -> log.info(key + " -> " + value));
}
}
application.yml
foo-filter:
bar-filters:
filtered1@mail.com: all
filtered2@mail.com: all
filtered3@mail.com: some
filtered4@mail.com: none
baz-filters:
filtered1: all@mail.com
filtered2: none@mail.com
最后,这是控制台输出:
filtered1mail.com -> all
filtered2mail.com -> all
filtered3mail.com -> some
filtered4mail.com -> none
filtered1 -> all@mail.com
filtered2 -> none@mail.com
第一个Map(barFilters
)键不包含@
个字符。我尝试过的另一件事:
->在两边加上双引号("
)
->使用带转义符(\@
)的@。
->使用等效于@({U+0040
)的Unicode。
->使用等效于@({\u0040
)的转义序列。
->使用等效于@({@
)的HTML代码。
他们都没有工作。
为什么会发生这种情况,我该如何解决?这是错误还是功能?
答案 0 :(得分:1)
根据this comment,您必须使用
foo-filter:
bar-filters:
"[filtered1@mail.com]": all
"[filtered2@mail.com]": all
"[filtered3@mail.com]": some
"[filtered4@mail.com]": none
baz-filters:
filtered1: all@mail.com
filtered2: none@mail.com