Never run data.sql scripts if spring.datasource.initialize is false
Previously, the data scripts were always run in response to the publication of a DataSourceInitializedEvent, irrespective of spring.datasource.initialize. While the event won't be published by DataSourceInitializer if spring.datasource.initialize is false, it will be published if spring.jpa.hibernate.hbm2ddl.auto has been set. This commit updates DataSourceInitializer's handling of DataSourceInitializedEvent to only run the data scripts if spring.datasource.initialize is true. Fixes #1336
This commit is contained in:
parent
e185793396
commit
7d213950ad
|
|
@ -88,6 +88,10 @@ class DataSourceInitializer implements ApplicationListener<DataSourceInitialized
|
|||
|
||||
@Override
|
||||
public void onApplicationEvent(DataSourceInitializedEvent event) {
|
||||
if (!this.properties.isInitialize()) {
|
||||
logger.debug("Initialization disabled (not running data scripts)");
|
||||
return;
|
||||
}
|
||||
// NOTE the event can happen more than once and
|
||||
// the event datasource is not used here
|
||||
if (!this.initialized) {
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
|
||||
package org.springframework.boot.autoconfigure.jdbc;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.Random;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
|
@ -31,6 +32,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext
|
|||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
import org.springframework.jdbc.BadSqlGrammarException;
|
||||
import org.springframework.jdbc.core.JdbcOperations;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.util.ClassUtils;
|
||||
|
|
@ -38,6 +40,7 @@ import org.springframework.util.ClassUtils;
|
|||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
/**
|
||||
* Tests for {@link DataSourceInitializer}.
|
||||
|
|
@ -96,7 +99,7 @@ public class DataSourceInitializerTests {
|
|||
assertTrue(dataSource instanceof org.apache.tomcat.jdbc.pool.DataSource);
|
||||
assertNotNull(dataSource);
|
||||
JdbcOperations template = new JdbcTemplate(dataSource);
|
||||
assertEquals(new Integer(0),
|
||||
assertEquals(new Integer(1),
|
||||
template.queryForObject("SELECT COUNT(*) from BAR", Integer.class));
|
||||
}
|
||||
|
||||
|
|
@ -104,32 +107,40 @@ public class DataSourceInitializerTests {
|
|||
public void testDataSourceInitializedWithExplicitScript() throws Exception {
|
||||
this.context.register(DataSourceAutoConfiguration.class,
|
||||
PropertyPlaceholderAutoConfiguration.class);
|
||||
EnvironmentTestUtils.addEnvironment(
|
||||
this.context,
|
||||
"spring.datasource.initialize:true",
|
||||
"spring.datasource.schema:"
|
||||
+ ClassUtils.addResourcePathToPackagePath(getClass(),
|
||||
"schema.sql"));
|
||||
EnvironmentTestUtils
|
||||
.addEnvironment(
|
||||
this.context,
|
||||
"spring.datasource.initialize:true",
|
||||
"spring.datasource.schema:"
|
||||
+ ClassUtils.addResourcePathToPackagePath(getClass(),
|
||||
"schema.sql"),
|
||||
"spring.datasource.data:"
|
||||
+ ClassUtils.addResourcePathToPackagePath(getClass(),
|
||||
"data.sql"));
|
||||
this.context.refresh();
|
||||
DataSource dataSource = this.context.getBean(DataSource.class);
|
||||
assertTrue(dataSource instanceof org.apache.tomcat.jdbc.pool.DataSource);
|
||||
assertNotNull(dataSource);
|
||||
JdbcOperations template = new JdbcTemplate(dataSource);
|
||||
assertEquals(new Integer(0),
|
||||
assertEquals(new Integer(1),
|
||||
template.queryForObject("SELECT COUNT(*) from FOO", Integer.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDataSourceInitializedWithMultipleScripts() throws Exception {
|
||||
EnvironmentTestUtils.addEnvironment(
|
||||
this.context,
|
||||
"spring.datasource.initialize:true",
|
||||
"spring.datasource.schema:"
|
||||
+ ClassUtils.addResourcePathToPackagePath(getClass(),
|
||||
"schema.sql")
|
||||
+ ","
|
||||
+ ClassUtils.addResourcePathToPackagePath(getClass(),
|
||||
"another.sql"));
|
||||
EnvironmentTestUtils
|
||||
.addEnvironment(
|
||||
this.context,
|
||||
"spring.datasource.initialize:true",
|
||||
"spring.datasource.schema:"
|
||||
+ ClassUtils.addResourcePathToPackagePath(getClass(),
|
||||
"schema.sql")
|
||||
+ ","
|
||||
+ ClassUtils.addResourcePathToPackagePath(getClass(),
|
||||
"another.sql"),
|
||||
"spring.datasource.data:"
|
||||
+ ClassUtils.addResourcePathToPackagePath(getClass(),
|
||||
"data.sql"));
|
||||
this.context.register(DataSourceAutoConfiguration.class,
|
||||
PropertyPlaceholderAutoConfiguration.class);
|
||||
this.context.refresh();
|
||||
|
|
@ -137,7 +148,7 @@ public class DataSourceInitializerTests {
|
|||
assertTrue(dataSource instanceof org.apache.tomcat.jdbc.pool.DataSource);
|
||||
assertNotNull(dataSource);
|
||||
JdbcOperations template = new JdbcTemplate(dataSource);
|
||||
assertEquals(new Integer(0),
|
||||
assertEquals(new Integer(1),
|
||||
template.queryForObject("SELECT COUNT(*) from FOO", Integer.class));
|
||||
assertEquals(new Integer(0),
|
||||
template.queryForObject("SELECT COUNT(*) from SPAM", Integer.class));
|
||||
|
|
@ -170,6 +181,31 @@ public class DataSourceInitializerTests {
|
|||
template.queryForObject("SELECT name from BAR WHERE id=2", String.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInitializationDisabled() throws Exception {
|
||||
this.context.register(DataSourceAutoConfiguration.class,
|
||||
PropertyPlaceholderAutoConfiguration.class);
|
||||
this.context.refresh();
|
||||
|
||||
DataSource dataSource = this.context.getBean(DataSource.class);
|
||||
|
||||
this.context.publishEvent(new DataSourceInitializedEvent(dataSource));
|
||||
|
||||
assertTrue(dataSource instanceof org.apache.tomcat.jdbc.pool.DataSource);
|
||||
assertNotNull(dataSource);
|
||||
JdbcOperations template = new JdbcTemplate(dataSource);
|
||||
|
||||
try {
|
||||
template.queryForObject("SELECT COUNT(*) from BAR", Integer.class);
|
||||
fail("Query should have failed as BAR table does not exist");
|
||||
}
|
||||
catch (BadSqlGrammarException ex) {
|
||||
SQLException sqlException = ex.getSQLException();
|
||||
int expectedCode = -5501; // user lacks privilege or object not found
|
||||
assertEquals(expectedCode, sqlException.getErrorCode());
|
||||
}
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@EnableConfigurationProperties
|
||||
protected static class TwoDataSources {
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
INSERT INTO BAR VALUES (1, 'Andy');
|
||||
|
|
@ -0,0 +1 @@
|
|||
INSERT INTO FOO VALUES (1, 'Andy');
|
||||
Loading…
Reference in New Issue