Han*_*ier 40 java spring spring-boot
我想知道,如果有一个通用的方法用属性填充地图你只知道前缀.
假设有很多属性,比如
namespace.prop1=value1
namespace.prop2=value2
namespace.iDontKnowThisNameAtCompileTime=anothervalue
Run Code Online (Sandbox Code Playgroud)
我想有一个通用的方法在地图中填充这个属性,比如
@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();
}
}
Run Code Online (Sandbox Code Playgroud)
或者是否有另一种方便的方法来收集具有特定前缀的所有属性,而不是迭代环境中的所有PropertySources?
谢谢Hansjoerg
And*_*son 70
只要你乐意将每个属性添加到地图中,而不仅仅是那些你事先不知道的属性,你可以这样做@ConfigurationProperties.如果你想获取下面的所有内容,namespace那么你需要使用一个空前缀并为名为的地图提供一个getter namespace:
@ConfigurationProperties("")
public class CustomProperties {
private final Map<String, String> namespace = new HashMap<>();
public Map<String, String> getNamespace() {
return namespace;
}
}
Run Code Online (Sandbox Code Playgroud)
Spring Boot使用该getNamespace方法检索地图,以便可以向其添加属性.有了这些属性:
namespace.a=alpha
namespace.b=bravo
namespace.c=charlie
Run Code Online (Sandbox Code Playgroud)
该namespace地图将包含三个条目:
{a=alpha, b=bravo, c=charlie}
Run Code Online (Sandbox Code Playgroud)
如果属性嵌套得更深,例如:
namespace.foo.bar.a=alpha
namespace.foo.bar.b=bravo
namespace.foo.bar.c=charlie
Run Code Online (Sandbox Code Playgroud)
然后你会使用namespace.foo作为前缀,并重新命名namespace,并getNamespace在CustomProperties以bar和getBar分别.
请注意,您应该应用于@EnableConfigurationProperties您的配置以启用支持@ConfigurationProperties.然后,您可以使用该批注引用要处理的任何bean,而不是@Bean为它们提供方法,或者使用@Component组件扫描发现它们:
@SpringBootApplication
@EnableConfigurationProperties(CustomProperties.class)
public class YourApplication {
// …
}
Run Code Online (Sandbox Code Playgroud)
MMa*_*rin 12
除此之外,我的问题是我没有多个简单的键/值属性,而是整个对象:
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"
Run Code Online (Sandbox Code Playgroud)
按照 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]
}
}
Run Code Online (Sandbox Code Playgroud)
像魅力一样工作,谢谢!
| 归档时间: |
|
| 查看次数: |
43292 次 |
| 最近记录: |