将 application.yml 中的属性注入地图

Injecting properties from application.yml to a map

我的 application.yml 具有如下所示的不同属性。

   lists:
      exampleList: [1,2,3]
      exampleString: abcde
      another:
         example1: exam1
         example2: exam2

我正在使用 @ConfigurationProperties

将这些属性绑定到 Spring 组件
@Data
@Component
@ConfigurationProperties
public class ExampleConfig {
    private Map<String,Object> lists;
}

我将在 spring-boot 控制器中注入此组件并将此配置绑定到获取配置端点 /controller/config

调用此端点时,预期是 return

{
      "lists": {
         "exampleList": ["1", "2", "3"],
         "exampleString": "abcde"
         "another": {
            "example1": "exam1",
            "example2": "exam2"
         }
      }

   }

而是 return 如下所示的响应

{
          "lists": {
             "exampleList": {
                 "0" : "1",
                 "1" : "2",
                 "2" : "3"
             }
             "exampleString": "abcde"
             "another": {
                "example1": "exam1",
                "example2": "exam2"
             }
          }

       }

正在将 yml 中的列表映射到 Map 中的对象。我们如何才能实现对各个数据类型的正确绑定?

感谢您的帮助!

有更复杂的解决方案可用。您可以使用一个简单的 Java DTO 来代表您的配置结构,而不是将所有配置注入 Map

使用 @ConfigurationProperties 和 return JavaDTO 从您的控制器端点将您的配置注入 Java DTO。

参考https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-typesafe-configuration-properties


Spring 引导执行器端点也有一个名为 configprops 的特定端点,它提供所有配置属性。 但是,如果您想使用它,您可能需要进行大量定制。 欲了解更多信息 https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html