Spring Boot从application.yml注入Map时不包含特殊字符

时间:2019-11-28 14:01:25

标签: java spring spring-boot properties yaml

我有一个简单的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)的转义序列。

->使用等效于@({&#64;)的HTML代码。

他们都没有工作。

为什么会发生这种情况,我该如何解决?这是错误还是功能?

1 个答案:

答案 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