#java #spring #spring-boot #spring-data
#java #весна #весенняя загрузка #spring-данные
Вопрос:
Скажем, у меня есть класс POJO, например:
class Foo {
String name;
int id;
}
Как мне указать этот объект в файле свойств, чтобы я мог сделать что-то подобное:
Foo foo = environment.getProperty("foo", Foo.class);
Я пробовал это, но это не работает:
foo.name = "My Name"
foo.id = 1234
Я не хочу использовать @ConfigurationProperties
, потому что хочу читать свойства во время выполнения.
Ответ №1:
Используйте его V1 — springboot1.x (скопируйте из shardingsphere)
private static Object v1(Environment environment, String prefix, boolean handlePlaceholder) {
try {
Class<?> resolverClass = Class.forName("org.springframework.boot.bind.RelaxedPropertyResolver");
Constructor<?> resolverConstructor = resolverClass.getDeclaredConstructor(PropertyResolver.class);
Method getSubPropertiesMethod = resolverClass.getDeclaredMethod("getSubProperties", String.class);
Object resolverObject = resolverConstructor.newInstance(environment);
String prefixParam = prefix.endsWith(".") ? prefix : prefix ".";
Method getPropertyMethod = resolverClass.getDeclaredMethod("getProperty", String.class);
Map<String, Object> dataSourceProps = (Map)getSubPropertiesMethod.invoke(resolverObject, prefixParam);
Map<String, Object> propertiesWithPlaceholderResolved = new HashMap();
Iterator var11 = dataSourceProps.entrySet().iterator();
while(true) {
while(var11.hasNext()) {
Entry<String, Object> entry = (Entry)var11.next();
String key = (String)entry.getKey();
Object value = entry.getValue();
if (handlePlaceholder amp;amp; value instanceof String amp;amp; ((String)value).contains("${")) {
String resolvedValue = (String)getPropertyMethod.invoke(resolverObject, prefixParam key);
propertiesWithPlaceholderResolved.put(key, resolvedValue);
} else {
propertiesWithPlaceholderResolved.put(key, value);
}
}
return Collections.unmodifiableMap(propertiesWithPlaceholderResolved);
}
} catch (Throwable var16) {
throw var16;
}
}
private static Object v2(Environment environment, String prefix, Class<?> targetClass) {
try {
Class<?> binderClass = Class.forName("org.springframework.boot.context.properties.bind.Binder");
Method getMethod = binderClass.getDeclaredMethod("get", Environment.class);
Method bindMethod = binderClass.getDeclaredMethod("bind", String.class, Class.class);
Object binderObject = getMethod.invoke((Object)null, environment);
String prefixParam = prefix.endsWith(".") ? prefix.substring(0, prefix.length() - 1) : prefix;
Object bindResultObject = bindMethod.invoke(binderObject, prefixParam, targetClass);
Method resultGetMethod = bindResultObject.getClass().getDeclaredMethod("get");
return resultGetMethod.invoke(bindResultObject);
} catch (Throwable var10) {
throw var10;
}
}
Комментарии:
1. Большое спасибо, это работает. Однако я заметил, что он терпит неудачу, когда префикс имеет символ подчеркивания или тому подобное.