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:
Andy Wilkinson 2014-08-06 14:48:26 +01:00
parent e185793396
commit 7d213950ad
4 changed files with 60 additions and 18 deletions

View File

@ -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) {

View File

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

View File

@ -0,0 +1 @@
INSERT INTO BAR VALUES (1, 'Andy');

View File

@ -0,0 +1 @@
INSERT INTO FOO VALUES (1, 'Andy');