我有一个弹簧靴,它大量使用@ConfigurationProperties来将我的yaml文件映射到java对象。现在,我将属性外部化并从外部服务中获取它。因此,我创建了一个自定义PropertySource,并将其作为第一个PropertySource添加到MutablePropertySources中。除了用例外,它一切正常,例如,我有一个以firstName作为字段的java对象,然后在Spring Boot尝试获取值key name = first-name时。对于其他PropertySource,它使用所有不同的组合,例如:firstName,first-name等。但是对于我的自定义PropertySource,它仅使用名字。我尝试调试,发现很少有打包的受保护的类用于获取所有可能的组合。我不想重复逻辑以获取给定键的所有可能组合,所以如果我可以做一些事情来形成弹簧,并且如果我做错了并且可以做得更好,请让我知道。
public class CustomPropertySource extends PropertySource<Map<String,Object>> {
public CustomPropertySource(String name, Map<String, Object> source) {
super(name, source);
}
@Override
public Object getProperty(String s) {
if(s.startsWith("employee")) {
System.out.println("in custom employee property");
}
Object value = source.get(s);
System.out.println("key: " + s + " value: " + value);
return value;
}
}
public class MyPropertyInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
val props = new CustomPropertySource("yaml", getProperties());
final MutablePropertySources propertySources = applicationContext.getEnvironment().getPropertySources();
propertySources.addFirst(props);
}
private Map<String, Object> getProperties() {
Yaml yaml = new Yaml();
InputStream inputStream = CCMServiceApplication.class
.getClassLoader()
.getResourceAsStream("customer.yml");
Map<String, Object> obj = yaml.load(inputStream);
obj.put("employee.first-name", "Sachin -O");
obj.put("employee.last-name", "Jain -O");
obj.put("employee.middle-name", "Kumar -O");
obj.put("employee.first-name", "Sachin -O");
return obj;
}
}