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

Скажем, у меня есть класс POJO:

class Foo {
    String name;
    int id;
}

Как указать этот объект в файле свойств, чтобы я мог сделать что-то вроде этого:

Foo foo = environment.getProperty("foo", Foo.class);

Я пробовал это, но это не работает:

foo.name = "My Name"
foo.id = 1234

Я не хочу использовать @ConfigurationProperties, потому что хочу читать свойства во время выполнения.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
727
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 && value instanceof String && ((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;
    }
}

Большое спасибо, это работает. Однако я заметил, что он терпит неудачу, когда префикс имеет подчеркивание или тому подобное.

Andrew Scott 16.12.2020 12:53

Другие вопросы по теме