web-dev-qa-db-ja.com

プログラムでSpring-boot application.propertiesをオーバーライドする方法

私は外部設定Webサービスから取得したjdbcプロパティファイルを持っていますmybootプロパティを設定するために春のブートでapplication.propertiesに追加するのは簡単です:

spring.datasource.url=jdbc:mysql://localhost/mydb
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

アプリでそれらをプログラムでオーバーライドするにはどうすればよいですか?

同じことが春バッチ小道具にも当てはまります。

database.driver=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost/mydv
database.username=root
database.password=root
40
rayman

ApplicationEnvironmentPreparedイベントに反応するライフサイクルリスナーに追加のプロパティソースを追加できます。

以下のラインに沿ったもの:

public class DatabasePropertiesListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {
  public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
    ConfigurableEnvironment environment = event.getEnvironment();
    Properties props = new Properties();
    props.put("spring.datasource.url", "<my value>");
    environment.getPropertySources().addFirst(new PropertiesPropertySource("myProps", props));
  }
}

次に、クラスをsrc/main/resources/META-INF/spring.factoriesに登録します。

org.springframework.context.ApplicationListener=my.package.DatabasePropertiesListener

これは私にとってはうまくいきましたが、アプリケーションの起動段階のかなり早い段階で、この時点で何ができるかについてはある程度制限されています。他の春に頼らずに必要な値を取得する方法を見つける必要があります豆など.

45
Lukas Hinsch

参照用にこのスレッドに別のオプションを提供するために、要件の答えを探し始めたとき、これは検索リストで高くなりましたが、私のユースケースをカバーしていませんでした。

起動時にプログラムでスプリングブートプロパティを設定しようとしていましたが、スプリングがサポートするさまざまなXML/Configファイルを操作する必要はありませんでした。

最も簡単な方法は、SpringApplicationの定義時にプロパティを設定することです。以下の基本的な例では、Tomcatポートを9999に設定します。

@SpringBootApplication
public class Demo40Application{

    public static void main(String[] args){
        SpringApplication application = new SpringApplication(Demo40Application.class);

        Properties properties = new Properties();
        properties.put("server.port", 9999);
        application.setDefaultProperties(properties);

        application.run(args);
    }
}
26
Roger Thomas

Spring Boot 1.3以降では、この目的で EnvironmentPostProcessor を使用できます。そのサブクラスを作成し、META-INF/spring.factoriesに登録します。良い例は次のとおりです。

https://github.com/spring-cloud/spring-cloud-sleuth/blob/48f3f9783f277a795d0210399f0ea09b7f1a4e71/spring-cloud-sleuth-core/src/main/Java/org/springframework/cloud/sleuth/autoconfig/ TraceEnvironmentPostProcessor.Java

18
Peter Szanto

Spring Boot 2.0.Xでは、カスタムApplicationContextInitializerとContextConfigurationアノテーションの組み合わせを使用して、個々のプロパティを動的にオーバーライドできます(ユニットテストなど)。

import org.junit.Test;
import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.PortTest.RandomPortInitailizer;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.support.TestPropertySourceUtils;
import org.springframework.util.SocketUtils;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(initializers = RandomPortInitializer.class)
public class PortTest {
    @Autowired
    private SomeService service;

    @Test
    public void testName() throws Exception {
        System.out.println(this.service);
        assertThat(this.service.toString()).containsOnlyDigits();
    }

    @Configuration
    static class MyConfig {

        @Bean
        public SomeService someService(@Value("${my.random.port}") int port) {
            return new SomeService(port);
        }
    }

    static class SomeService {
        private final int port;

        public SomeService(int port) {
            this.port = port;
        }

        @Override
        public String toString() {
            return String.valueOf(this.port);
        }
    }

    public static class RandomPortInitializer
            implements ApplicationContextInitializer<ConfigurableApplicationContext> {

        @Override
        public void initialize(ConfigurableApplicationContext applicationContext) {
            int randomPort = SocketUtils.findAvailableTcpPort();
            TestPropertySourceUtils.addInlinedPropertiesToEnvironment(applicationContext,
                    "my.random.port=" + randomPort);
        }
    }
}
3
Jason

構成でこのメソッドを使用すると、デフォルトのプロパティを設定できます。

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class)
              .properties("propertyKey=propertyValue");
}
1
Dimitri

これは、必要に応じてプログラムでapplication.propertiesをオーバーライドする方法です。

public static void main(String[] args) {
    SpringApplication app = new SpringApplication(Restdemo1Application.class);
    app.setAdditionalProfiles("dev"); 
    // overrides "application.properties" with  "application-dev.properties"
    app.run(args);

}
0

META-INFフォルダーの下に次のフォルダーとファイルを正確に作成します:spring> batch> override> data-source-context.xmlそして、xmlファイルで、このように必要なパラメーターをオーバーライドしてください。

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${loader.jdbc.driver}" />
    <property name="url" value="${loader.jdbc.url}" />
    <property name="username" value="${loader.jdbc.username}" />
    <property name="password" value="${loader.jdbc.password}" />
</bean>

<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

または、xmlファイルでこのようなjndiを使用して、catalina.propertiesなどの外部構成ファイルにアクセスします

<jee:jndi-lookup id="dataSource"
    jndi-name="Java:comp/env/jdbc/loader-batch-dataSource" lookup-on-startup="true"
    resource-ref="true" cache="true" />
0
Shilan