我有一些代码在2之前的Spring Boot上可以正常工作,我发现很难将其转换为在Spring Boot 2上工作。
有人可以协助吗?
public static MutablePropertySources buildPropertySources(String propertyFile, String profile)
{
try
{
Properties properties = new Properties();
YamlPropertySourceLoader loader = new YamlPropertySourceLoader();
// load common properties
PropertySource<?> applicationYamlPropertySource = loader.load("properties", new ClassPathResource(propertyFile), null);
Map<String, Object> source = ((MapPropertySource) applicationYamlPropertySource).getSource();
properties.putAll(source);
// load profile properties
if (null != profile)
{
applicationYamlPropertySource = loader.load("properties", new ClassPathResource(propertyFile), profile);
if (null != applicationYamlPropertySource)
{
source = ((MapPropertySource) applicationYamlPropertySource).getSource();
properties.putAll(source);
}
}
propertySources = new MutablePropertySources();
propertySources.addLast(new PropertiesPropertySource("apis", properties));
}
catch (Exception e)
{
log.error("{} file cannot be found.", propertyFile);
return null;
}
}
public static <T> void handleConfigurationProperties(T bean, MutablePropertySources propertySources) throws BindException
{
ConfigurationProperties configurationProperties = bean.getClass().getAnnotation(ConfigurationProperties.class);
if (null != configurationProperties && null != propertySources)
{
String prefix = configurationProperties.prefix();
String value = configurationProperties.value();
if (null == value || value.isEmpty())
{
value = prefix;
}
PropertiesConfigurationFactory<?> configurationFactory = new PropertiesConfigurationFactory<>(bean);
configurationFactory.setPropertySources(propertySources);
configurationFactory.setTargetName(value);
configurationFactory.bindPropertiesToTarget();
}
}
PropertiesConfigurationFactory
不再存在,并且YamlPropertySourceLoader
加载方法不再接受3个参数。
(响应也不相同,当我尝试调用新方法时,响应对象被包装好了,而不是直接给我直接输入字符串/整数等)
答案 0 :(得分:0)
PropertiesConfigurationFactory
应该替换为Binder
类。
示例代码:-
ConfigurationPropertySource source = new MapConfigurationPropertySource(
loadProperties(resource));
Binder binder = new Binder(source);
return binder.bind("initializr", InitializrProperties.class).get();
我们还使用PropertiesConfigurationFactory将POJO绑定到 环境的前缀。在2.0中,全新的Binder API 引入了更灵活,更易于使用的功能。我们的约束力 用了10行代码就可以简化为3行。
YamlPropertySourceLoader:-
是的,该类在版本2中已更改。它不再接受第三个参数profile
。方法签名已更改为返回List<PropertySource<?>>
而不是PropertySource<?>
。如果您希望使用单一来源,请从列表中获取第一个匹配项。
将资源加载到一个或多个属性源中。实作 可能返回包含单个来源的列表,或者 多文档格式(例如yaml)作为文档中每个文档的来源 资源。
答案 1 :(得分:0)
由于尚无公认的答案,因此我发布了完整的解决方案,该解决方案基于@nationquest的答案:
private ConfigClass loadConfiguration(String path){
MutablePropertySources sources = new MutablePropertySources();
Resource res = new FileSystemResource(path);
PropertiesFactoryBean propFactory = new PropertiesFactoryBean();
propFactory.setLocation(res);
propFactory.setSingleton(false);
// resolve potential references to local environment variables
Properties properties = null;
try {
properties = propFactory.getObject();
for(String p : properties.stringPropertyNames()){
properties.setProperty(p, env.resolvePlaceholders(properties.getProperty(p)));
}
} catch (IOException e) {
e.printStackTrace();
}
sources.addLast(new PropertiesPropertySource("prefix", properties));
ConfigurationPropertySource propertySource = new MapConfigurationPropertySource(properties);
return new Binder(propertySource).bind("prefix", ConfigClass.class).get();
}
最后三行是这里的相关部分。
答案 2 :(得分:-1)