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

Ogu*_*glu 2 java spring yaml properties spring-boot

我有一个简单的 Spring Boot 项目,旨在读取和转换数据application.yml并将其转换为 Java Map<String,String>。在我项目的业务层中,我需要用电子邮件地址作为关键字填充该地图。问题从这里开始。Spring(或 Spring Boot)无法按我的意愿工作。它完全忽略@键侧的字符,但在值侧正常工作。

下面是一些代码:

应用程序.java

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

引导程序

@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));
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序.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
Run Code Online (Sandbox Code Playgroud)

最后,这是控制台输出:

filtered1mail.com -> all
filtered2mail.com -> all
filtered3mail.com -> some
filtered4mail.com -> none
filtered1 -> all@mail.com
filtered2 -> none@mail.com
Run Code Online (Sandbox Code Playgroud)

第一个 Map ( barFilters) 键不包含@字符。我尝试过的另一件事:

->"在两边添加双引号 ( )。

-> 将 @ 与转义字符 ( \@)一起使用。

-> 使用与@ ( U+0040)等效的 Unicode 。

-> 使用等效于 @ ( \u0040) 的转义序列。

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

他们都没有工作。

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

fly*_*lyx 5

根据此评论,您必须使用

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
Run Code Online (Sandbox Code Playgroud)