2015-03-16 10 views
20

Ich habe jdbc Eigenschaftsdateien, die ich von externen Konfigurations Web-Service in Anspruch nehmen Im Frühjahr Boot, um mysql Requisiten legen Sie es als Zugabe diejenigen application.properties einfach ist:Wie Frühlings-Boot-application.properties außer Kraft setzen programmatisch

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

Wie kann ich diese Programme in meiner App überschreiben?

gleiche gilt für den Frühling-Batch Requisiten:

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

Antwort

24

Sie zusätzliche Eigenschaft Quellen in einem Lifecycle-Listener hinzufügen können, um ApplicationEnvironmentPrepared Ereignis reagieren.

Etwas entlang der Linien von:

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)); 
    } 
} 

dann die Klasse in src registrieren/main/resources/META-INF/spring.factories:

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

Das ist für mich gearbeitet, aber Sie sind in Bezug auf das, was Sie an diesem Punkt tun können, ziemlich begrenzt, da es ziemlich früh in der Anwendungsstartphase ist, müssen Sie einen Weg finden, die benötigten Werte zu erhalten, ohne auf andere Frühlingsbohnen usw. angewiesen zu sein.

+2

Genau das, was ich brauchte. Wenn es jemandem hilft, können Sie vorhandene Eigenschaften aus der Datei application.properties mithilfe der Umgebung abrufen.getProperty ("") und verwenden Sie es weiter in Ihrem Code. Am Ende habe ich eine dynamische Anzahl von Hornetqueus erstellt, indem ich die Eigenschaft spring.hornetq.embedded.queues aus einer Ganzzahl, die in meiner Eigenschaftendatei definiert wurde, bevölkert habe. – Avnish

+0

Dieser funktioniert auch für mich! Mein Anwendungsfall ist, das db-Passwort beim Start der App dynamisch zu entschlüsseln. – TonyLxc

+0

Funktioniert gut! Vielen Dank! – user770119

0

Unter Ordner META-INF erstellen genau diese Ordner und Datei: spring> Batch> Überschreibung> Daten-source-context.xml und in der XML-Datei stellen Sie sicher, die Paramter Sie wollen wie diese außer Kraft zu setzen:

<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> 

oder eine jndi wie dies in der xML-Datei verwenden, um Ihre externe Konfigurationsdatei wie catalina.properties zuzugreifen

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

einfach eine andere Option auf diesen Thread als Referenz zur Verfügung zu stellen, wie wenn ich eine Antwort für meine Anforderung zu suchen begann das kam auf der Suchliste hoch, aber nicht meinen Anwendungsfall.

Ich wollte programmgesteuert Federboot-Eigenschaft beim Start festlegen, aber ohne die Notwendigkeit, mit den verschiedenen XML/Config-Dateien arbeiten, die Feder unterstützt.

Der einfachste Weg besteht darin, die Eigenschaften zu dem Zeitpunkt festzulegen, an dem SpringApplication definiert wird. Das grundlegende Beispiel unten stellt den tomcat-Port 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); 
    } 
} 
+1

Dies überschreibt nicht die internen Eigenschaften, aber eine gute Lösung, um zusätzliche Eigenschaften hinzuzufügen –

0

Dies ist, wie Sie die application.properties außer Kraft setzen können programmatisch, wenn Sie müssen.

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); 

} 
1

Mit dieser Methode in Ihrer Konfiguration können Sie Standardeigenschaften festlegen.

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