2015-07-29 5 views
4

У меня есть приложение пружины, настроенное с помощью аннотаций. Вот часть моей конфигурацииизменить исходный адрес источника во время работы весной

@Configuration 
@EnableTransactionManagement 
public class JpaSpringConfiguration { 

    @Bean(destroyMethod = "close") 
    @Lazy 
    @Primary 
    public BasicDataSource dataSource(@Value("${statistics.hostname}") String statisticsHostname) { 
     final BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName("org.postgresql.Driver"); 
     String url = String.format("jdbc:postgresql://%s:5432/statistics-db", statisticsHostname); 
     dataSource.setUrl(url); 
     .... 
     return dataSource; 
    } 

    @Bean 
    public static PropertyPlaceholderConfigurer propertyPlaceholderConfigurer() { 
     final PropertyPlaceholderConfigurer placeholderConfigurer = new PropertyPlaceholderConfigurer(); 
     placeholderConfigurer.setSystemPropertiesMode(SYSTEM_PROPERTIES_MODE_OVERRIDE); 
     Properties properties = new Properties(); 
     properties.setProperty("statistics.hostname", "localhost"); 

     placeholderConfigurer.setProperties(properties); 
     return placeholderConfigurer; 
    } 

До недавнего времени мы не имели конфигурации XML

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
    <property name="properties"> 
     <props> 
      <prop key="statistics.hostname">localhost</prop> 
     </props> 
    </property> 
</bean> 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" lazy-init="true" destroy-method="close"> 
    <property name="driverClassName" value="org.postgresql.Driver" /> 
    <property name="url" value="jdbc:postgresql://${statistics.hostname}:5432/statistics-db" /> 
    <property name="username" value="user" /> 
    <property name="password" value="password" /> 
</bean> 

Когда пользователь выбрал другой сервер для подключения к мы устанавливаем системное свойство и замкнутый контекст приложения и обновилась

System.setProperty("statistics.hostname", hostname) 
applicationContext.close() 
applicationContext.refresh() 

Это не работает, когда я использую конфигурацию аннотаций. Мои вопросы:

  1. Почему это не работает?
  2. Как избавиться от установки имени хоста через системное свойство вообще?

EDIT: Я только что узнал, что я забыл $ {} вокруг имени параметра в методе dataSource(). Так что теперь это работает, но вопрос 2 все еще остается.

+0

Что такое переменная 'statHostname' в конфигурации аннотации и как она инициализируется? –

+0

Это параметр метода dataSource(). Я скопировал его неправильно. –

ответ

0

не знаю, почему он не работает, но вы можете попробовать сделать пару более вещей:

  1. закрывает контекст перед обновлением действительно необходимо? Попробуйте только обновить его.
  2. Вы можете пометить свой bean-компонент как @RefreshScope (но он требует весеннего облака) и обновить его с помощью /refresh конечной точки. Это потребует, чтобы другая конечная точка фактически обновляла ваш хост в компоненте перед вызовом обновления.

«Как избавиться от установки имени хоста через системное свойство в целом?»

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

spring.datasource.url= 
spring.datasource.username= 
spring.datasource.password= 
... 

Недвижимость. Компонент источника данных будет создан с использованием этих значений для вас.

+0

Я не могу использовать файл свойств, потому что имя хоста вводится пользователем, а пользователь также часто меняет сервер, к которому они подключены. –

+0

, затем попробуйте добавить контроллер, который будет вызываться, когда пользователь вводит имя хоста (передайте его контроллеру), сохраните это имя хоста в компоненте dataSource() и попытайтесь обновить его с учетом моей точки 1/2 :) .properties file может использоваться для хранения значения имени хоста по умолчанию, которое будет использоваться в случае перезапуска приложения. – freakman

Смежные вопросы