Чтение значений из внешнего файла конфигурации возвращает нулевые значения - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть файл конфигурации config.properties, который содержит следующее содержимое:

myFirstName='John'  
myLastName='Doe'

У меня также есть очень простой класс конфигурации, который просто выводит значения файла config.properties:

@Configuration
@ComponentScan(basePackages = {"com.boot.Training.*"})
@PropertySource("classpath:config.properties")
public class AppConfig {

    @Value("${myFirstName}")
    private static String myFirstName;

    @Value("${myLastName}")
    private static String myLastName;

    public static void showVariables() {
        System.out.println("firstName: " + myFirstName);
        System.out.println("lastName: " + myLastName);
    }

}

Проблема в том, что когда значения выводятся на консоль, они отображаются нулевыми, даже если им явно присваивается значение в файле config.properties .:

2018-09-08 10:52:46.334  INFO 2787 --- [           main] c.b.Training.EnvironmentVariables.App    : Started App in 2.542 seconds (JVM running for 3.084)
firstName: null
lastName: null

Что яздесь не хватает?

1 Ответ

0 голосов
/ 09 сентября 2018

Ваша проблема связана с ключевым словом static. Поскольку инициализация статических полей происходит во многих процессорных циклах до того, как Spring контейнеры запустятся . Так что удалите ключевое слово static из вашей переменной класса;

@Value("${myFirstName}")
private String myFirstName;

@Value("${myLastName}")
private String myLastName;

РЕДАКТИРОВАТЬ: Я добавил свой код, который работает правильно. И мой основной класс, который начинает весенний контекст вот так;

public class AppMain {

    public static void main(String args[]){
        AbstractApplicationContext  context = new AnnotationConfigApplicationContext(AppConfig.class);
        context.close();
    }

}

Так по моему AppConfig.class вот так;

@Configuration
@ComponentScan(basePackages = "com.example.spring")
@PropertySource(value = {"classpath:application.properties"})
public class AppConfig implements InitializingBean {

    @Value("${firstKey}")
    private String myFirstName;

    @Value("${secondKey}")
    private String myLastName;

    public void showVariables() {
        System.out.println("firstName: " + myFirstName);
        System.out.println("lastName: " + myLastName);
    }

    public void afterPropertiesSet() throws Exception {
        showVariables();
    }
}

Не заботьтесь о реализации InitializingBean. Это дает нам то, что вы хотите, когда бин был создан. Как и постконструкция.

Также мой application.configuration есть;

firstKey = firsKeyValue
secondKey = secondKeyValue

Теперь, когда я запускаю приложение, я вижу этот вывод;

org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@37bba400: startup date [Sun Sep 09 11:37:35 EET 2018]; root of context hierarchy
firstName: firsKeyValue
lastName: secondKeyValue

Это работает, я думаю. Примените свои требования и попробуйте один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...