Commit 14b7be83 authored by Vedran Pavic's avatar Vedran Pavic Committed by Stephane Nicoll

Harmonize database initializers

This commit updates database initializers configuration to enable them
automatically only when an embedded `DataSource` is used. Related
configuration properties have been updated to use a more expressive
`DatabaseInitializerMode` enum rather than `Boolean` flag.

See gh-9752
parent 29078c78
/* /*
* Copyright 2012-2016 the original author or authors. * Copyright 2012-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure; ...@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnection;
import org.springframework.boot.jdbc.DatabaseDriver; import org.springframework.boot.jdbc.DatabaseDriver;
import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.ResourceLoader;
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils; import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils;
...@@ -52,7 +53,8 @@ public abstract class AbstractDatabaseInitializer { ...@@ -52,7 +53,8 @@ public abstract class AbstractDatabaseInitializer {
@PostConstruct @PostConstruct
protected void initialize() { protected void initialize() {
if (!isEnabled()) { if ((getMode() == DatabaseInitializerMode.EMBEDDED && !isEmbeddedDataSource())
|| getMode() == DatabaseInitializerMode.NEVER) {
return; return;
} }
ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
...@@ -66,7 +68,7 @@ public abstract class AbstractDatabaseInitializer { ...@@ -66,7 +68,7 @@ public abstract class AbstractDatabaseInitializer {
DatabasePopulatorUtils.execute(populator, this.dataSource); DatabasePopulatorUtils.execute(populator, this.dataSource);
} }
protected abstract boolean isEnabled(); protected abstract DatabaseInitializerMode getMode();
protected abstract String getSchemaLocation(); protected abstract String getSchemaLocation();
...@@ -86,4 +88,8 @@ public abstract class AbstractDatabaseInitializer { ...@@ -86,4 +88,8 @@ public abstract class AbstractDatabaseInitializer {
} }
} }
private boolean isEmbeddedDataSource() {
return EmbeddedDatabaseConnection.isEmbedded(this.dataSource);
}
} }
/*
* Copyright 2012-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure;
/**
* Supported {@link AbstractDatabaseInitializer database initializer} modes.
*
* @author Vedran Pavic
* @since 2.0.0
*/
public enum DatabaseInitializerMode {
/**
* Always enabled.
*/
ALWAYS,
/**
* Enabled when using an embedded database.
*/
EMBEDDED,
/**
* Never enabled.
*/
NEVER
}
/* /*
* Copyright 2012-2016 the original author or authors. * Copyright 2012-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.batch; ...@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.batch;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.springframework.boot.autoconfigure.AbstractDatabaseInitializer; import org.springframework.boot.autoconfigure.AbstractDatabaseInitializer;
import org.springframework.boot.autoconfigure.DatabaseInitializerMode;
import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.ResourceLoader;
import org.springframework.util.Assert; import org.springframework.util.Assert;
...@@ -40,8 +41,8 @@ public class BatchDatabaseInitializer extends AbstractDatabaseInitializer { ...@@ -40,8 +41,8 @@ public class BatchDatabaseInitializer extends AbstractDatabaseInitializer {
} }
@Override @Override
protected boolean isEnabled() { protected DatabaseInitializerMode getMode() {
return this.properties.getInitializer().isEnabled(); return this.properties.getInitializeSchema();
} }
@Override @Override
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package org.springframework.boot.autoconfigure.batch; package org.springframework.boot.autoconfigure.batch;
import org.springframework.boot.autoconfigure.DatabaseInitializerMode;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
/** /**
...@@ -42,7 +43,10 @@ public class BatchProperties { ...@@ -42,7 +43,10 @@ public class BatchProperties {
*/ */
private String tablePrefix; private String tablePrefix;
private final Initializer initializer = new Initializer(); /**
* Spring Batch database schema initialization mode.
*/
private DatabaseInitializerMode initializeSchema = DatabaseInitializerMode.EMBEDDED;
private final Job job = new Job(); private final Job job = new Job();
...@@ -62,36 +66,16 @@ public class BatchProperties { ...@@ -62,36 +66,16 @@ public class BatchProperties {
this.tablePrefix = tablePrefix; this.tablePrefix = tablePrefix;
} }
public Initializer getInitializer() { public DatabaseInitializerMode getInitializeSchema() {
return this.initializer; return this.initializeSchema;
} }
public Job getJob() { public void setInitializeSchema(DatabaseInitializerMode initializeSchema) {
return this.job; this.initializeSchema = initializeSchema;
}
public class Initializer {
/**
* Create the required batch tables on startup if necessary. Enabled automatically
* if no custom table prefix is set or if a custom schema is configured.
*/
private Boolean enabled;
public boolean isEnabled() {
if (this.enabled != null) {
return this.enabled;
}
boolean defaultTablePrefix = BatchProperties.this.getTablePrefix() == null;
boolean customSchema = !DEFAULT_SCHEMA_LOCATION
.equals(BatchProperties.this.getSchema());
return (defaultTablePrefix || customSchema);
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
} }
public Job getJob() {
return this.job;
} }
public static class Job { public static class Job {
......
...@@ -147,7 +147,6 @@ public class IntegrationAutoConfiguration { ...@@ -147,7 +147,6 @@ public class IntegrationAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.integration.jdbc.initializer", name = "enabled")
public IntegrationDatabaseInitializer integrationDatabaseInitializer( public IntegrationDatabaseInitializer integrationDatabaseInitializer(
DataSource dataSource, ResourceLoader resourceLoader, DataSource dataSource, ResourceLoader resourceLoader,
IntegrationProperties properties) { IntegrationProperties properties) {
......
...@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.integration; ...@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.integration;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.springframework.boot.autoconfigure.AbstractDatabaseInitializer; import org.springframework.boot.autoconfigure.AbstractDatabaseInitializer;
import org.springframework.boot.autoconfigure.DatabaseInitializerMode;
import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.ResourceLoader;
import org.springframework.util.Assert; import org.springframework.util.Assert;
...@@ -40,8 +41,8 @@ public class IntegrationDatabaseInitializer extends AbstractDatabaseInitializer ...@@ -40,8 +41,8 @@ public class IntegrationDatabaseInitializer extends AbstractDatabaseInitializer
} }
@Override @Override
protected boolean isEnabled() { protected DatabaseInitializerMode getMode() {
return this.properties.getInitializer().isEnabled(); return this.properties.getInitializeSchema();
} }
@Override @Override
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package org.springframework.boot.autoconfigure.integration; package org.springframework.boot.autoconfigure.integration;
import org.springframework.boot.autoconfigure.DatabaseInitializerMode;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
/** /**
...@@ -44,7 +45,10 @@ public class IntegrationProperties { ...@@ -44,7 +45,10 @@ public class IntegrationProperties {
*/ */
private String schema = DEFAULT_SCHEMA_LOCATION; private String schema = DEFAULT_SCHEMA_LOCATION;
private final Initializer initializer = new Initializer(); /**
* Spring Integration database schema initialization mode.
*/
private DatabaseInitializerMode initializeSchema = DatabaseInitializerMode.EMBEDDED;
public String getSchema() { public String getSchema() {
return this.schema; return this.schema;
...@@ -54,25 +58,12 @@ public class IntegrationProperties { ...@@ -54,25 +58,12 @@ public class IntegrationProperties {
this.schema = schema; this.schema = schema;
} }
public Initializer getInitializer() { public DatabaseInitializerMode getInitializeSchema() {
return this.initializer; return this.initializeSchema;
}
public class Initializer {
/**
* Create the required integration tables on startup.
*/
private boolean enabled = false;
public boolean isEnabled() {
return this.enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
} }
public void setInitializeSchema(DatabaseInitializerMode initializeSchema) {
this.initializeSchema = initializeSchema;
} }
} }
......
...@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.quartz; ...@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.quartz;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.springframework.boot.autoconfigure.AbstractDatabaseInitializer; import org.springframework.boot.autoconfigure.AbstractDatabaseInitializer;
import org.springframework.boot.autoconfigure.DatabaseInitializerMode;
import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.ResourceLoader;
import org.springframework.util.Assert; import org.springframework.util.Assert;
...@@ -40,8 +41,8 @@ public class QuartzDatabaseInitializer extends AbstractDatabaseInitializer { ...@@ -40,8 +41,8 @@ public class QuartzDatabaseInitializer extends AbstractDatabaseInitializer {
} }
@Override @Override
protected boolean isEnabled() { protected DatabaseInitializerMode getMode() {
return this.properties.getJdbc().isInitializeSchema(); return this.properties.getJdbc().getInitializeSchema();
} }
@Override @Override
......
...@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.quartz; ...@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.quartz;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.springframework.boot.autoconfigure.DatabaseInitializerMode;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
/** /**
...@@ -70,9 +71,9 @@ public class QuartzProperties { ...@@ -70,9 +71,9 @@ public class QuartzProperties {
private String schema = DEFAULT_SCHEMA_LOCATION; private String schema = DEFAULT_SCHEMA_LOCATION;
/** /**
* Create the required Quartz Scheduler tables on startup. * Quartz Scheduler database schema initialization mode.
*/ */
private boolean initializeSchema; private DatabaseInitializerMode initializeSchema = DatabaseInitializerMode.EMBEDDED;
public String getSchema() { public String getSchema() {
return this.schema; return this.schema;
...@@ -82,11 +83,11 @@ public class QuartzProperties { ...@@ -82,11 +83,11 @@ public class QuartzProperties {
this.schema = schema; this.schema = schema;
} }
public boolean isInitializeSchema() { public DatabaseInitializerMode getInitializeSchema() {
return this.initializeSchema; return this.initializeSchema;
} }
public void setInitializeSchema(boolean initializeSchema) { public void setInitializeSchema(DatabaseInitializerMode initializeSchema) {
this.initializeSchema = initializeSchema; this.initializeSchema = initializeSchema;
} }
......
...@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.session; ...@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.session;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.springframework.boot.autoconfigure.AbstractDatabaseInitializer; import org.springframework.boot.autoconfigure.AbstractDatabaseInitializer;
import org.springframework.boot.autoconfigure.DatabaseInitializerMode;
import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.ResourceLoader;
import org.springframework.util.Assert; import org.springframework.util.Assert;
...@@ -40,8 +41,8 @@ public class JdbcSessionDatabaseInitializer extends AbstractDatabaseInitializer ...@@ -40,8 +41,8 @@ public class JdbcSessionDatabaseInitializer extends AbstractDatabaseInitializer
} }
@Override @Override
protected boolean isEnabled() { protected DatabaseInitializerMode getMode() {
return this.properties.getInitializer().isEnabled(); return this.properties.getInitializeSchema();
} }
@Override @Override
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package org.springframework.boot.autoconfigure.session; package org.springframework.boot.autoconfigure.session;
import org.springframework.boot.autoconfigure.DatabaseInitializerMode;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
/** /**
...@@ -42,7 +43,10 @@ public class JdbcSessionProperties { ...@@ -42,7 +43,10 @@ public class JdbcSessionProperties {
*/ */
private String tableName = DEFAULT_TABLE_NAME; private String tableName = DEFAULT_TABLE_NAME;
private final Initializer initializer = new Initializer(); /**
* Spring Session database schema initialization mode.
*/
private DatabaseInitializerMode initializeSchema = DatabaseInitializerMode.EMBEDDED;
public String getSchema() { public String getSchema() {
return this.schema; return this.schema;
...@@ -60,32 +64,12 @@ public class JdbcSessionProperties { ...@@ -60,32 +64,12 @@ public class JdbcSessionProperties {
this.tableName = tableName; this.tableName = tableName;
} }
public Initializer getInitializer() { public DatabaseInitializerMode getInitializeSchema() {
return this.initializer; return this.initializeSchema;
}
public class Initializer {
/**
* Create the required session tables on startup if necessary. Enabled
* automatically if the default table name is set or a custom schema is
* configured.
*/
private Boolean enabled;
public boolean isEnabled() {
if (this.enabled != null) {
return this.enabled;
}
boolean defaultTableName = DEFAULT_TABLE_NAME.equals(getTableName());
boolean customSchema = !DEFAULT_SCHEMA_LOCATION.equals(getSchema());
return (defaultTableName || customSchema);
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
} }
public void setInitializeSchema(DatabaseInitializerMode initializeSchema) {
this.initializeSchema = initializeSchema;
} }
} }
...@@ -47,6 +47,7 @@ import org.springframework.batch.support.transaction.ResourcelessTransactionMana ...@@ -47,6 +47,7 @@ import org.springframework.batch.support.transaction.ResourcelessTransactionMana
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner; import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.DatabaseInitializerMode;
import org.springframework.boot.autoconfigure.TestAutoConfigurationPackage; import org.springframework.boot.autoconfigure.TestAutoConfigurationPackage;
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration; import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
...@@ -86,8 +87,9 @@ public class BatchAutoConfigurationTests { ...@@ -86,8 +87,9 @@ public class BatchAutoConfigurationTests {
EmbeddedDataSourceConfiguration.class).run((context) -> { EmbeddedDataSourceConfiguration.class).run((context) -> {
assertThat(context).hasSingleBean(JobLauncher.class); assertThat(context).hasSingleBean(JobLauncher.class);
assertThat(context).hasSingleBean(JobExplorer.class); assertThat(context).hasSingleBean(JobExplorer.class);
assertThat(context.getBean(BatchProperties.class).getInitializer() assertThat(
.isEnabled()).isTrue(); context.getBean(BatchProperties.class).getInitializeSchema())
.isEqualTo(DatabaseInitializerMode.EMBEDDED);
assertThat(new JdbcTemplate(context.getBean(DataSource.class)) assertThat(new JdbcTemplate(context.getBean(DataSource.class))
.queryForList("select * from BATCH_JOB_EXECUTION")).isEmpty(); .queryForList("select * from BATCH_JOB_EXECUTION")).isEmpty();
}); });
...@@ -169,11 +171,12 @@ public class BatchAutoConfigurationTests { ...@@ -169,11 +171,12 @@ public class BatchAutoConfigurationTests {
.withUserConfiguration(TestConfiguration.class, .withUserConfiguration(TestConfiguration.class,
EmbeddedDataSourceConfiguration.class) EmbeddedDataSourceConfiguration.class)
.withPropertyValues("spring.datasource.generate-unique-name=true", .withPropertyValues("spring.datasource.generate-unique-name=true",
"spring.batch.initializer.enabled:false") "spring.batch.initialize-schema:never")
.run((context) -> { .run((context) -> {
assertThat(context).hasSingleBean(JobLauncher.class); assertThat(context).hasSingleBean(JobLauncher.class);
assertThat(context.getBean(BatchProperties.class).getInitializer() assertThat(
.isEnabled()).isFalse(); context.getBean(BatchProperties.class).getInitializeSchema())
.isEqualTo(DatabaseInitializerMode.NEVER);
this.expected.expect(BadSqlGrammarException.class); this.expected.expect(BadSqlGrammarException.class);
new JdbcTemplate(context.getBean(DataSource.class)) new JdbcTemplate(context.getBean(DataSource.class))
.queryForList("select * from BATCH_JOB_EXECUTION"); .queryForList("select * from BATCH_JOB_EXECUTION");
...@@ -210,8 +213,9 @@ public class BatchAutoConfigurationTests { ...@@ -210,8 +213,9 @@ public class BatchAutoConfigurationTests {
"spring.batch.tablePrefix:PREFIX_") "spring.batch.tablePrefix:PREFIX_")
.run((context) -> { .run((context) -> {
assertThat(context).hasSingleBean(JobLauncher.class); assertThat(context).hasSingleBean(JobLauncher.class);
assertThat(context.getBean(BatchProperties.class).getInitializer() assertThat(
.isEnabled()).isTrue(); context.getBean(BatchProperties.class).getInitializeSchema())
.isEqualTo(DatabaseInitializerMode.EMBEDDED);
assertThat(new JdbcTemplate(context.getBean(DataSource.class)) assertThat(new JdbcTemplate(context.getBean(DataSource.class))
.queryForList("select * from PREFIX_JOB_EXECUTION")) .queryForList("select * from PREFIX_JOB_EXECUTION"))
.isEmpty(); .isEmpty();
...@@ -223,25 +227,6 @@ public class BatchAutoConfigurationTests { ...@@ -223,25 +227,6 @@ public class BatchAutoConfigurationTests {
}); });
} }
@Test
public void testCustomTablePrefixWithDefaultSchemaDisablesInitializer()
throws Exception {
this.contextRunner
.withUserConfiguration(TestConfiguration.class,
EmbeddedDataSourceConfiguration.class,
HibernateJpaAutoConfiguration.class)
.withPropertyValues("spring.datasource.generate-unique-name=true",
"spring.batch.tablePrefix:PREFIX_")
.run((context) -> {
assertThat(context).hasSingleBean(JobLauncher.class);
assertThat(context.getBean(BatchProperties.class).getInitializer()
.isEnabled()).isFalse();
this.expected.expect(BadSqlGrammarException.class);
new JdbcTemplate(context.getBean(DataSource.class))
.queryForList("select * from BATCH_JOB_EXECUTION");
});
}
@Test @Test
public void testCustomizeJpaTransactionManagerUsingProperties() throws Exception { public void testCustomizeJpaTransactionManagerUsingProperties() throws Exception {
this.contextRunner this.contextRunner
......
...@@ -27,6 +27,7 @@ import org.springframework.batch.core.explore.JobExplorer; ...@@ -27,6 +27,7 @@ import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.batch.core.launch.JobLauncher; import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.repository.JobRepository;
import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.DatabaseInitializerMode;
import org.springframework.boot.autoconfigure.TestAutoConfigurationPackage; import org.springframework.boot.autoconfigure.TestAutoConfigurationPackage;
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration; import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.test.City; import org.springframework.boot.autoconfigure.orm.jpa.test.City;
...@@ -66,8 +67,9 @@ public class BatchAutoConfigurationWithoutJpaTests { ...@@ -66,8 +67,9 @@ public class BatchAutoConfigurationWithoutJpaTests {
assertThat( assertThat(
context.getBean(PlatformTransactionManager.class).toString()) context.getBean(PlatformTransactionManager.class).toString())
.contains("DataSourceTransactionManager"); .contains("DataSourceTransactionManager");
assertThat(context.getBean(BatchProperties.class).getInitializer() assertThat(
.isEnabled()).isTrue(); context.getBean(BatchProperties.class).getInitializeSchema())
.isEqualTo(DatabaseInitializerMode.EMBEDDED);
assertThat(new JdbcTemplate(context.getBean(DataSource.class)) assertThat(new JdbcTemplate(context.getBean(DataSource.class))
.queryForList("select * from BATCH_JOB_EXECUTION")).isEmpty(); .queryForList("select * from BATCH_JOB_EXECUTION")).isEmpty();
assertThat(context.getBean(JobExplorer.class) assertThat(context.getBean(JobExplorer.class)
......
...@@ -26,6 +26,7 @@ import org.junit.Rule; ...@@ -26,6 +26,7 @@ import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.ExpectedException; import org.junit.rules.ExpectedException;
import org.springframework.boot.autoconfigure.DatabaseInitializerMode;
import org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration.IntegrationComponentScanAutoConfiguration; import org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration.IntegrationComponentScanAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration; import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
...@@ -152,9 +153,9 @@ public class IntegrationAutoConfigurationTests { ...@@ -152,9 +153,9 @@ public class IntegrationAutoConfigurationTests {
DataSourceTransactionManagerAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class,
JdbcTemplateAutoConfiguration.class, IntegrationAutoConfiguration.class }, JdbcTemplateAutoConfiguration.class, IntegrationAutoConfiguration.class },
"spring.datasource.generate-unique-name=true", "spring.datasource.generate-unique-name=true",
"spring.integration.jdbc.initializer.enabled=true"); "spring.integration.jdbc.initialize-schema=always");
assertThat(this.context.getBean(IntegrationProperties.class).getJdbc() assertThat(this.context.getBean(IntegrationProperties.class).getJdbc()
.getInitializer().isEnabled()).isTrue(); .getInitializeSchema()).isEqualTo(DatabaseInitializerMode.ALWAYS);
JdbcOperations jdbcOperations = this.context.getBean(JdbcOperations.class); JdbcOperations jdbcOperations = this.context.getBean(JdbcOperations.class);
assertThat(jdbcOperations.queryForList("select * from INT_MESSAGE")).isEmpty(); assertThat(jdbcOperations.queryForList("select * from INT_MESSAGE")).isEmpty();
assertThat(jdbcOperations.queryForList("select * from INT_GROUP_TO_MESSAGE")) assertThat(jdbcOperations.queryForList("select * from INT_GROUP_TO_MESSAGE"))
...@@ -172,25 +173,24 @@ public class IntegrationAutoConfigurationTests { ...@@ -172,25 +173,24 @@ public class IntegrationAutoConfigurationTests {
DataSourceTransactionManagerAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class,
JdbcTemplateAutoConfiguration.class, IntegrationAutoConfiguration.class }, JdbcTemplateAutoConfiguration.class, IntegrationAutoConfiguration.class },
"spring.datasource.generate-unique-name=true", "spring.datasource.generate-unique-name=true",
"spring.integration.jdbc.initializer.enabled=false"); "spring.integration.jdbc.initialize-schema=never");
assertThat(this.context.getBean(IntegrationProperties.class).getJdbc() assertThat(this.context.getBean(IntegrationProperties.class).getJdbc()
.getInitializer().isEnabled()).isFalse(); .getInitializeSchema()).isEqualTo(DatabaseInitializerMode.NEVER);
JdbcOperations jdbcOperations = this.context.getBean(JdbcOperations.class); JdbcOperations jdbcOperations = this.context.getBean(JdbcOperations.class);
this.thrown.expect(BadSqlGrammarException.class); this.thrown.expect(BadSqlGrammarException.class);
jdbcOperations.queryForList("select * from INT_MESSAGE"); jdbcOperations.queryForList("select * from INT_MESSAGE");
} }
@Test @Test
public void integrationJdbcDatabaseInitializerDisabledByDefault() { public void integrationJdbcDatabaseInitializerEnabledByDefaultWithEmbeddedDb() {
load(new Class[] { EmbeddedDataSourceConfiguration.class, load(new Class[] { EmbeddedDataSourceConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class,
JdbcTemplateAutoConfiguration.class, IntegrationAutoConfiguration.class }, JdbcTemplateAutoConfiguration.class, IntegrationAutoConfiguration.class },
"spring.datasource.generate-unique-name=true"); "spring.datasource.generate-unique-name=true");
assertThat(this.context.getBean(IntegrationProperties.class).getJdbc() assertThat(this.context.getBean(IntegrationProperties.class).getJdbc()
.getInitializer().isEnabled()).isFalse(); .getInitializeSchema()).isEqualTo(DatabaseInitializerMode.EMBEDDED);
JdbcOperations jdbcOperations = this.context.getBean(JdbcOperations.class); JdbcOperations jdbcOperations = this.context.getBean(JdbcOperations.class);
this.thrown.expect(BadSqlGrammarException.class); jdbcOperations.queryForList("select * from INT_MESSAGE").isEmpty();
jdbcOperations.queryForList("select * from INT_MESSAGE");
} }
private static void assertDomains(MBeanServer mBeanServer, boolean expected, private static void assertDomains(MBeanServer mBeanServer, boolean expected,
......
...@@ -108,7 +108,7 @@ public class QuartzAutoConfigurationTests { ...@@ -108,7 +108,7 @@ public class QuartzAutoConfigurationTests {
EmbeddedDataSourceConfiguration.class, EmbeddedDataSourceConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class }, DataSourceTransactionManagerAutoConfiguration.class },
"spring.quartz.job-store-type=jdbc", "spring.quartz.job-store-type=jdbc",
"spring.quartz.jdbc.initialize-schema=true"); "spring.quartz.jdbc.initialize-schema=always");
testWithDataSource(); testWithDataSource();
} }
...@@ -117,7 +117,7 @@ public class QuartzAutoConfigurationTests { ...@@ -117,7 +117,7 @@ public class QuartzAutoConfigurationTests {
load(new Class<?>[] { QuartzJobsConfiguration.class, load(new Class<?>[] { QuartzJobsConfiguration.class,
EmbeddedDataSourceConfiguration.class }, EmbeddedDataSourceConfiguration.class },
"spring.quartz.job-store-type=jdbc", "spring.quartz.job-store-type=jdbc",
"spring.quartz.jdbc.initialize-schema=true"); "spring.quartz.jdbc.initialize-schema=always");
testWithDataSource(); testWithDataSource();
} }
......
...@@ -23,6 +23,7 @@ import org.junit.Test; ...@@ -23,6 +23,7 @@ import org.junit.Test;
import org.junit.rules.ExpectedException; import org.junit.rules.ExpectedException;
import org.springframework.beans.DirectFieldAccessor; import org.springframework.beans.DirectFieldAccessor;
import org.springframework.boot.autoconfigure.DatabaseInitializerMode;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration; import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;
...@@ -54,8 +55,9 @@ public class SessionAutoConfigurationJdbcTests ...@@ -54,8 +55,9 @@ public class SessionAutoConfigurationJdbcTests
JdbcOperationsSessionRepository.class); JdbcOperationsSessionRepository.class);
assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName")) assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName"))
.isEqualTo("SPRING_SESSION"); .isEqualTo("SPRING_SESSION");
assertThat(this.context.getBean(JdbcSessionProperties.class).getInitializer() assertThat(
.isEnabled()).isTrue(); this.context.getBean(JdbcSessionProperties.class).getInitializeSchema())
.isEqualTo(DatabaseInitializerMode.EMBEDDED);
assertThat(this.context.getBean(JdbcOperations.class) assertThat(this.context.getBean(JdbcOperations.class)
.queryForList("select * from SPRING_SESSION")).isEmpty(); .queryForList("select * from SPRING_SESSION")).isEmpty();
} }
...@@ -65,13 +67,14 @@ public class SessionAutoConfigurationJdbcTests ...@@ -65,13 +67,14 @@ public class SessionAutoConfigurationJdbcTests
load(Arrays.asList(EmbeddedDataSourceConfiguration.class, load(Arrays.asList(EmbeddedDataSourceConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class), DataSourceTransactionManagerAutoConfiguration.class),
"spring.session.store-type=jdbc", "spring.session.store-type=jdbc",
"spring.session.jdbc.initializer.enabled=false"); "spring.session.jdbc.initialize-schema=never");
JdbcOperationsSessionRepository repository = validateSessionRepository( JdbcOperationsSessionRepository repository = validateSessionRepository(
JdbcOperationsSessionRepository.class); JdbcOperationsSessionRepository.class);
assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName")) assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName"))
.isEqualTo("SPRING_SESSION"); .isEqualTo("SPRING_SESSION");
assertThat(this.context.getBean(JdbcSessionProperties.class).getInitializer() assertThat(
.isEnabled()).isFalse(); this.context.getBean(JdbcSessionProperties.class).getInitializeSchema())
.isEqualTo(DatabaseInitializerMode.NEVER);
this.thrown.expect(BadSqlGrammarException.class); this.thrown.expect(BadSqlGrammarException.class);
assertThat(this.context.getBean(JdbcOperations.class) assertThat(this.context.getBean(JdbcOperations.class)
.queryForList("select * from SPRING_SESSION")).isEmpty(); .queryForList("select * from SPRING_SESSION")).isEmpty();
...@@ -88,27 +91,11 @@ public class SessionAutoConfigurationJdbcTests ...@@ -88,27 +91,11 @@ public class SessionAutoConfigurationJdbcTests
JdbcOperationsSessionRepository.class); JdbcOperationsSessionRepository.class);
assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName")) assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName"))
.isEqualTo("FOO_BAR"); .isEqualTo("FOO_BAR");
assertThat(this.context.getBean(JdbcSessionProperties.class).getInitializer() assertThat(
.isEnabled()).isTrue(); this.context.getBean(JdbcSessionProperties.class).getInitializeSchema())
.isEqualTo(DatabaseInitializerMode.EMBEDDED);
assertThat(this.context.getBean(JdbcOperations.class) assertThat(this.context.getBean(JdbcOperations.class)
.queryForList("select * from FOO_BAR")).isEmpty(); .queryForList("select * from FOO_BAR")).isEmpty();
} }
@Test
public void customTableNameWithDefaultSchemaDisablesInitializer() {
load(Arrays.asList(EmbeddedDataSourceConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class),
"spring.session.store-type=jdbc",
"spring.session.jdbc.table-name=FOO_BAR");
JdbcOperationsSessionRepository repository = validateSessionRepository(
JdbcOperationsSessionRepository.class);
assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName"))
.isEqualTo("FOO_BAR");
assertThat(this.context.getBean(JdbcSessionProperties.class).getInitializer()
.isEnabled()).isFalse();
this.thrown.expect(BadSqlGrammarException.class);
assertThat(this.context.getBean(JdbcOperations.class)
.queryForList("select * from SPRING_SESSION")).isEmpty();
}
} }
...@@ -132,7 +132,7 @@ content into your application; rather pick only the properties that you need. ...@@ -132,7 +132,7 @@ content into your application; rather pick only the properties that you need.
# QUARTZ SCHEDULER ({sc-spring-boot-autoconfigure}/quartz/QuartzProperties.{sc-ext}[QuartzProperties]) # QUARTZ SCHEDULER ({sc-spring-boot-autoconfigure}/quartz/QuartzProperties.{sc-ext}[QuartzProperties])
spring.quartz.job-store-type=memory # Quartz job store type. spring.quartz.job-store-type=memory # Quartz job store type.
spring.quartz.properties.*= # Additional Quartz Scheduler properties. spring.quartz.properties.*= # Additional Quartz Scheduler properties.
spring.quartz.jdbc.initialize-schema=false # Create the required Quartz Scheduler tables on startup. spring.quartz.jdbc.initialize-schema=embedded # Quartz Scheduler database schema initialization mode.
spring.quartz.jdbc.schema=classpath:org/quartz/impl/jdbcjobstore/tables_@@platform@@.sql # Path to the SQL file to use to initialize the database schema. spring.quartz.jdbc.schema=classpath:org/quartz/impl/jdbcjobstore/tables_@@platform@@.sql # Path to the SQL file to use to initialize the database schema.
# Reactor # Reactor
...@@ -416,7 +416,7 @@ content into your application; rather pick only the properties that you need. ...@@ -416,7 +416,7 @@ content into your application; rather pick only the properties that you need.
# SPRING SESSION ({sc-spring-boot-autoconfigure}/session/SessionProperties.{sc-ext}[SessionProperties]) # SPRING SESSION ({sc-spring-boot-autoconfigure}/session/SessionProperties.{sc-ext}[SessionProperties])
spring.session.hazelcast.flush-mode=on-save # Sessions flush mode. spring.session.hazelcast.flush-mode=on-save # Sessions flush mode.
spring.session.hazelcast.map-name=spring:session:sessions # Name of the map used to store sessions. spring.session.hazelcast.map-name=spring:session:sessions # Name of the map used to store sessions.
spring.session.jdbc.initializer.enabled= # Create the required session tables on startup if necessary. Enabled automatically if the default table name is set or a custom schema is configured. spring.session.jdbc.initialize-schema=embedded # Spring Session database schema initialization mode.
spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema. spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema.
spring.session.jdbc.table-name=SPRING_SESSION # Name of database table used to store sessions. spring.session.jdbc.table-name=SPRING_SESSION # Name of database table used to store sessions.
spring.session.redis.flush-mode=on-save # Sessions flush mode. spring.session.redis.flush-mode=on-save # Sessions flush mode.
...@@ -942,14 +942,14 @@ content into your application; rather pick only the properties that you need. ...@@ -942,14 +942,14 @@ content into your application; rather pick only the properties that you need.
spring.artemis.user= # Login user of the broker. spring.artemis.user= # Login user of the broker.
# SPRING BATCH ({sc-spring-boot-autoconfigure}/batch/BatchProperties.{sc-ext}[BatchProperties]) # SPRING BATCH ({sc-spring-boot-autoconfigure}/batch/BatchProperties.{sc-ext}[BatchProperties])
spring.batch.initializer.enabled= # Create the required batch tables on startup if necessary. Enabled automatically if no custom table prefix is set or if a custom schema is configured. spring.batch.initialize-schema=embedded # Spring Batch database schema initialization mode.
spring.batch.job.enabled=true # Execute all Spring Batch jobs in the context on startup. spring.batch.job.enabled=true # Execute all Spring Batch jobs in the context on startup.
spring.batch.job.names= # Comma-separated list of job names to execute on startup (For instance `job1,job2`). By default, all Jobs found in the context are executed. spring.batch.job.names= # Comma-separated list of job names to execute on startup (For instance `job1,job2`). By default, all Jobs found in the context are executed.
spring.batch.schema=classpath:org/springframework/batch/core/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema. spring.batch.schema=classpath:org/springframework/batch/core/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema.
spring.batch.table-prefix= # Table prefix for all the batch meta-data tables. spring.batch.table-prefix= # Table prefix for all the batch meta-data tables.
# SPRING INTEGRATION ({sc-spring-boot-autoconfigure}/integration/IntegrationProperties.{sc-ext}[IntegrationProperties]) # SPRING INTEGRATION ({sc-spring-boot-autoconfigure}/integration/IntegrationProperties.{sc-ext}[IntegrationProperties])
spring.integration.jdbc.initializer.enabled=false # Create the required integration tables on startup. spring.integration.jdbc.initialize-schema=embedded # Spring Integration database schema initialization mode.
spring.integration.jdbc.schema=classpath:org/springframework/integration/jdbc/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema. spring.integration.jdbc.schema=classpath:org/springframework/integration/jdbc/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema.
# JMS ({sc-spring-boot-autoconfigure}/jms/JmsProperties.{sc-ext}[JmsProperties]) # JMS ({sc-spring-boot-autoconfigure}/jms/JmsProperties.{sc-ext}[JmsProperties])
......
...@@ -1936,11 +1936,12 @@ data. ...@@ -1936,11 +1936,12 @@ data.
=== Initialize a Spring Batch database === Initialize a Spring Batch database
If you are using Spring Batch then it comes pre-packaged with SQL initialization scripts If you are using Spring Batch then it comes pre-packaged with SQL initialization scripts
for most popular database platforms. Spring Boot will detect your database type, and for most popular database platforms. Spring Boot will detect your database type, and
execute those scripts by default, and in this case will switch the fail fast setting to execute those scripts by default when using an embedded database, and in this case will
false (errors are logged but do not prevent the application from starting). This is switch the fail fast setting to false (errors are logged but do not prevent the
because the scripts are known to be reliable and generally do not contain bugs, so errors application from starting). This is because the scripts are known to be reliable and
are ignorable, and ignoring them makes the scripts idempotent. You can switch off the generally do not contain bugs, so errors are ignorable, and ignoring them makes the
initialization explicitly using `spring.batch.initializer.enabled=false`. scripts idempotent. You can switch off the initialization explicitly using
`spring.batch.initialize-schema=never`.
......
...@@ -5568,7 +5568,7 @@ on startup: ...@@ -5568,7 +5568,7 @@ on startup:
[source,properties,indent=0] [source,properties,indent=0]
---- ----
spring.integration.jdbc.initializer.enabled=true spring.integration.jdbc.initialize-schema=always
---- ----
See the See the
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment