使用 ConfigurationProperties 以通用方式填充 Map

新手上路,请多包涵

我想知道,是否有一种通用方法可以用您只知道前缀的属性填充地图。

假设有一堆属性,比如

namespace.prop1=value1
namespace.prop2=value2
namespace.iDontKnowThisNameAtCompileTime=anothervalue

我想要一种通用的方法来在地图中填充这个属性,比如

@Component
@ConfigurationProperties("namespace")
public class MyGenericProps {
    private Map<String, String> propmap = new HashMap<String, String>();

    // setter and getter for propmap omitted

    public Set<String> returnAllKeys() {
        return propmap.keySet();
    }
}

或者是否有另一种方便的方法来收集具有特定前缀的所有属性,而不是遍历环境中的所有 PropertySources?

感谢 Hansjoerg

原文由 Hansjoerg Wingeier 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 784
2 个回答

只要您愿意将每个属性添加到地图中,而不仅仅是那些您事先不知道的属性,您就可以使用 @ConfigurationProperties 来完成。如果您想获取 namespace 下面的所有内容,那么您需要使用空前缀并为名为 namespace 的地图提供一个 getter:

 @ConfigurationProperties("")
public class CustomProperties {

    private final Map<String, String> namespace = new HashMap<>();

    public Map<String, String> getNamespace() {
        return namespace;
    }

}

Spring Boot 使用 getNamespace 方法来检索映射,以便它可以向其中添加属性。具有这些属性:

 namespace.a=alpha
namespace.b=bravo
namespace.c=charlie

namespace 地图将包含三个条目:

 {a=alpha, b=bravo, c=charlie}

如果属性嵌套得更深,例如:

 namespace.foo.bar.a=alpha
namespace.foo.bar.b=bravo
namespace.foo.bar.c=charlie

Then you’d use namespace.foo as the prefix and rename namespace and getNamespace on CustomProperties to bar and getBar 分别。

请注意,您应该将 @EnableConfigurationProperties 应用于您的配置以启用对 @ConfigurationProperties 的支持。然后,您可以使用该注释引用您想要处理的任何 beans,而不是为它们提供 @Bean 方法,或使用 @Component 让它们通过组件扫描发现:

 @SpringBootApplication
@EnableConfigurationProperties(CustomProperties.class)
public class YourApplication {
    // …
}

原文由 Andy Wilkinson 发布,翻译遵循 CC BY-SA 3.0 许可协议

除此之外,我的问题是我没有多个简单的键/值属性,而是整个对象:

 zuul:
  routes:
    query1:
      path: /api/apps/test1/query/**
      stripPrefix: false
      url: "https://test.url.com/query1"
    query2:
       path: /api/apps/test2/query/**
       stripPrefix: false
       url: "https://test.url.com/query2"
    index1:
       path: /api/apps/*/index/**
       stripPrefix: false
       url: "https://test.url.com/index"

按照 Jake 的建议,我尝试将 Map 与 Pojo 一起使用,如下所示:

 @ConfigurationProperties("zuul")
public class RouteConfig {
    private Map<String, Route> routes = new HashMap<>();

    public Map<String, Route> getRoutes() {
        return routes;
    }

    public static class Route {
        private String path;
        private boolean stripPrefix;
        String url;

        // [getters + setters]
    }
}

就像一个魅力,谢谢!

原文由 MMascarin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题