spring boot @refreshscope не обновляет источник данных

Я пытаюсь обновить источник данных БД, если изменяется переменная среды для DB.URL. Ниже мой класс,

@SpringBootApplication
@ConfigurationProperties(value="myapp")
public class MyApp {
@Value("${myapp.db.url}")
String databaseURL;

@Value("${myapp.db.username}")
String databaseUsername;

@Value("${myapp.db.password}")
String databasePassword;

public static void main(String[] args) {
    SpringApplication.run(MyApp.class, args);
}

@Bean
@RefreshScope
@Primary
public DataSource getDataSource() {
    return DataSourceBuilder.create().username(databaseUsername).password(databasePassword).url(databaseURL)
            .driverClassName("org.postgresql.Driver").build();
}
}

Но когда я обновляю среду DB.URL, он не делает запрос к новой БД.

Я сослался на документацию, поскольку можно обновить источник данных, http://projects.spring.io/spring-cloud/spring-cloud.html#_refresh_scope

Чего не хватает в моем классе?


person vishnukumar    schedule 08.08.2017    source источник
comment
Можете ли вы попытаться переместить это в свой собственный класс конфигурации, а не в основное загрузочное приложение Spring? Вам также может понадобиться RefreshScope в самой конфигурации.   -  person Darren Forsythe    schedule 08.08.2017
comment
Привет @DarrenForsythe Если я перенесу конфигурацию источника данных в отдельный класс с помощью @RefreshScope. Проект не может быть построен, поскольку клиент spring-cloud-config-client не может обнаружить источник данных. Ниже приведено исключение: ошибка создания bean-компонента с именем dataSource, определенным в ресурсе пути к классу [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Tomcat.class] в org.springframework.boot.actuate.autoconfigure.HealthIndicatorAutoConfiguration$DataSourcesHealthIndicatorConfiguration. ‹инициализация›(HealthIndicatorAutoConfiguration.java:195)   -  person vishnukumar    schedule 09.08.2017
comment
вы помещаете его в тот же пакет, что и приложение?   -  person Darren Forsythe    schedule 09.08.2017
comment
Привет @DarrenForsythe, да, я помещаю это в тот же пакет.   -  person vishnukumar    schedule 23.08.2017


Ответы (2)


Вам нужно переместить эту аннотацию @RefreshScope в контекст класса MyApp:

@SpringBootApplication
@ConfigurationProperties(value="myapp")
@RefreshScope
public class MyApp {
  ...
}

А также обязательно сделайте запрос POST на сервис: http://{your.api.url}/actuator/refresh, чтобы обновить его после того, как вы изменили свойства.

person Jonathan JOhx    schedule 28.10.2018

Если вы добавите @RefreshScope в класс, не удаляя его из метода. Затем переменные @Value будут обновлены. И источник данных изменится.

person Nicat Asgerzade    schedule 04.06.2020