POJO из файла свойств в Spring

#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. Большое спасибо, это работает. Однако я заметил, что он терпит неудачу, когда префикс имеет символ подчеркивания или тому подобное.