Ich habe erfolgreich eine Spring-Boot-Anwendung erstellt, die die eingebettete H2-Datenbank im Arbeitsspeicher verwendet. Ich möchte dies jetzt in eine dateibasierte Version ändern, die bestehen bleibt.
Ich habe versucht, einfach das zu ändern spring.datasource.*
Eigenschaften in meinem application.properties
Datei und sie sehen in etwa so aus:
spring.datasource.url=jdbc:h2:file:~/test;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.driverClassName=org.h2.Driver`
Es scheint, als ob Spring Boot diese Einstellungen einfach ignoriert, weil es einfach wie folgt beginnt:
o.s.j.d.e.EmbeddedDatabaseFactory : Starting embedded database: url="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false", username="sa"
Mein pom.xml
enthält die folgenden Abhängigkeiten, die für diesen Beitrag relevant sein könnten:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
</parent>
....
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
Mein Verständnis aus der Dokumentation und einer Reihe von Beiträgen ist, dass die Konfiguration nur funktionieren sollte, aber kein Glück für mich. Nur um einige der grundlegenden Fehler zu vermeiden, habe ich Folgendes versucht und überprüft:
- Meine Anwendungseigenschaften befinden sich im Klassenpfad:
- Ich habe versucht, die automatische Konfiguration in der Anmerkung auszuschließen
@EnableAutoConfiguration
- Ich habe versucht, a zu spritzen
dataSource
Bohne mit Kombinationen von Anmerkungen@Primary
,@ConfigurationProperties(prefix = "spring.datasource")
und die Eigenschaften programmgesteuert mit festlegenDataSourceBuilder
. Dies verursacht andere Fehler, die sich auf den Typ beziehennull
.
Scheint, als würde mir ein Schlüsselkonzept oder so etwas fehlen. Kann jemand helfen.
UPDATE 1: Auszug aus meinem Autokonfigurationsbericht:
Positive matches:
-----------------
DataSourceAutoConfiguration matched
- @ConditionalOnClass classes found: javax.sql.DataSource,org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType (OnClassCondition)
DataSourceAutoConfiguration.DataSourceInitializerConfiguration matched
- @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer; SearchStrategy: all) found no beans (OnBeanCondition)
DataSourceAutoConfiguration.EmbeddedConfiguration matched
- embedded database H2 detected (DataSourceAutoConfiguration.EmbeddedDataSourceCondition)
- @ConditionalOnMissingBean (types: javax.sql.DataSource,javax.sql.XADataSource; SearchStrategy: all) found no beans (OnBeanCondition)
DataSourceAutoConfiguration.JdbcTemplateConfiguration matched
- existing auto database detected (DataSourceAutoConfiguration.DataSourceAvailableCondition)
DataSourceAutoConfiguration.JdbcTemplateConfiguration#jdbcTemplate matched
- @ConditionalOnMissingBean (types: org.springframework.jdbc.core.JdbcOperations; SearchStrategy: all) found no beans (OnBeanCondition)
DataSourceAutoConfiguration.JdbcTemplateConfiguration#namedParameterJdbcTemplate matched
- @ConditionalOnMissingBean (types: org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; SearchStrategy: all) found no beans (OnBeanCondition)
DataSourceTransactionManagerAutoConfiguration matched
- @ConditionalOnClass classes found: org.springframework.jdbc.core.JdbcTemplate,org.springframework.transaction.PlatformTransactionManager (OnClassCondition)
DataSourceTransactionManagerAutoConfiguration.TransactionManagementConfiguration matched
- @ConditionalOnMissingBean (types: org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration; SearchStrategy: all) found no beans (OnBeanCondition)
H2ConsoleAutoConfiguration matched
- @ConditionalOnClass classes found: org.h2.server.web.WebServlet (OnClassCondition)
- found web application StandardServletEnvironment (OnWebApplicationCondition)
- matched (OnPropertyCondition)
HibernateJpaAutoConfiguration matched
- @ConditionalOnClass classes found: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean,org.springframework.transaction.annotation.EnableTransactionManagement,javax.persistence.EntityManager (OnClassCondition)
- found HibernateEntityManager class (HibernateJpaAutoConfiguration.HibernateEntityManagerCondition)
Negative matches:
-----------------
DataSourceAutoConfiguration.NonEmbeddedConfiguration did not match
- missing supported DataSource (DataSourceAutoConfiguration.NonEmbeddedDataSourceCondition)
`
UPDATE 2: Aktuator hinzugefügt und Endpunkt betrachtet /configprops
. Interessant ist hier, dass meine Konfiguration übernommen wurde und die Datenbank vorhanden ist, aber wenn die Anwendung ausgeführt wird, verwendet sie diese nicht dataSource
.
"spring.datasource.CONFIGURATION_PROPERTIES":
{"prefix":"spring.datasource",
"properties":{
"schema":null,
"data":null,
"xa":{"dataSourceClassName":null,
"properties":{}
},
"type":null,
"separator":";",
"url":"jdbc:h2:file:~/test;DB_CLOSE_ON_EXIT=FALSE",
"platform":"all",
"continueOnError":false,
"jndiName":null,
"sqlScriptEncoding":null,
"password":"******",
"name":"testdb",
"driverClassName":"org.h2.Driver",
"initialize":true,
"username":"test"
}
}