From 37121e69e6c2fdc70a0bd45aa9b50e0d2d2d769e Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Fri, 6 Jun 2014 07:19:51 +0100 Subject: [PATCH] Make DataSourceInitialization a no-op if there is no DataSource Fixes gh-1041 --- .../jdbc/DataSourceInitialization.java | 8 +- .../DataSourceAutoConfigurationTests.java | 73 ++--------- .../jdbc/DataSourceInitializationTests.java | 124 ++++++++++++++++++ 3 files changed, 136 insertions(+), 69 deletions(-) create mode 100644 spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializationTests.java diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitialization.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitialization.java index 4adac0ee2aa..d1d7a0b5bc2 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitialization.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitialization.java @@ -40,14 +40,15 @@ import org.springframework.util.StringUtils; /** * @author Dave Syer + * @since 1.1 */ @Configuration @EnableConfigurationProperties(DataSourceProperties.class) public class DataSourceInitialization { - private static Log logger = LogFactory.getLog(DataSourceAutoConfiguration.class); + private static Log logger = LogFactory.getLog(DataSourceInitialization.class); - @Autowired + @Autowired(required=false) private DataSource dataSource; @Autowired @@ -59,8 +60,7 @@ public class DataSourceInitialization { private boolean initialized = false; @Bean - public ApplicationListener dataSourceInitializedListener( - DataSource dataSource) { + public ApplicationListener dataSourceInitializedListener() { return new DataSourceInitializedListener(); } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java index f252e6b9f25..c3101bbc541 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java @@ -16,6 +16,11 @@ package org.springframework.boot.autoconfigure.jdbc; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + import java.net.URL; import java.net.URLClassLoader; import java.sql.Connection; @@ -40,18 +45,11 @@ import org.springframework.boot.test.EnvironmentTestUtils; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; -import org.springframework.util.ClassUtils; import com.zaxxer.hikari.HikariDataSource; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - /** * Tests for {@link DataSourceAutoConfiguration}. * @@ -72,6 +70,9 @@ public class DataSourceAutoConfigurationTests { @After public void restore() { EmbeddedDatabaseConnection.override = null; + if (context!=null) { + context.close(); + } } @Test @@ -214,64 +215,6 @@ public class DataSourceAutoConfigurationTests { assertNotNull(this.context.getBean(NamedParameterJdbcOperations.class)); } - @Test - public void testDataSourceInitialized() throws Exception { - EnvironmentTestUtils.addEnvironment(this.context, - "spring.datasource.initialize:true"); - this.context.register(DataSourceAutoConfiguration.class, - PropertyPlaceholderAutoConfiguration.class); - 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), - template.queryForObject("SELECT COUNT(*) from BAR", Integer.class)); - } - - @Test - 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")); - 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), - 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")); - this.context.register(DataSourceAutoConfiguration.class, - PropertyPlaceholderAutoConfiguration.class); - 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), - template.queryForObject("SELECT COUNT(*) from FOO", Integer.class)); - assertEquals(new Integer(0), - template.queryForObject("SELECT COUNT(*) from SPAM", Integer.class)); - } - @Configuration static class TestDataSourceConfiguration { diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializationTests.java new file mode 100644 index 00000000000..7151d7f75d3 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializationTests.java @@ -0,0 +1,124 @@ +/* + * Copyright 2013-2014 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.jdbc; + +import static org.junit.Assert.*; + +import java.util.Random; + +import javax.sql.DataSource; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.test.EnvironmentTestUtils; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.jdbc.core.JdbcOperations; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.util.ClassUtils; + +/** + * @author Dave Syer + * + */ +public class DataSourceInitializationTests { + + private final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + + @Before + public void init() { + EmbeddedDatabaseConnection.override = null; + EnvironmentTestUtils.addEnvironment(this.context, + "spring.datasource.initialize:false", + "spring.datasource.url:jdbc:hsqldb:mem:testdb-" + new Random().nextInt()); + } + + @After + public void restore() { + EmbeddedDatabaseConnection.override = null; + if (context!=null) { + context.close(); + } + } + + @Test + public void testDefaultDataSourceDoesNotExists() throws Exception { + this.context.register(DataSourceInitialization.class, + PropertyPlaceholderAutoConfiguration.class); + this.context.refresh(); + assertEquals(0, this.context.getBeanNamesForType(DataSource.class).length); + } + + @Test + public void testDataSourceInitialized() throws Exception { + EnvironmentTestUtils.addEnvironment(this.context, + "spring.datasource.initialize:true"); + this.context.register(DataSourceAutoConfiguration.class, + PropertyPlaceholderAutoConfiguration.class); + 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), + template.queryForObject("SELECT COUNT(*) from BAR", Integer.class)); + } + + @Test + 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")); + 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), + 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")); + this.context.register(DataSourceAutoConfiguration.class, + PropertyPlaceholderAutoConfiguration.class); + 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), + template.queryForObject("SELECT COUNT(*) from FOO", Integer.class)); + assertEquals(new Integer(0), + template.queryForObject("SELECT COUNT(*) from SPAM", Integer.class)); + } + +}