Skip to content

Commit 3c193b4

Browse files
committed
Address a case where ConnectionDetails is not generated
1 parent 37d2cd6 commit 3c193b4

File tree

2 files changed

+65
-28
lines changed

2 files changed

+65
-28
lines changed

doma-spring-boot-autoconfigure/src/main/java/org/seasar/doma/boot/autoconfigure/DomaAutoConfiguration.java

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import org.seasar.doma.jdbc.dialect.StandardDialect;
4040
import org.seasar.doma.jdbc.statistic.DefaultStatisticManager;
4141
import org.seasar.doma.jdbc.statistic.StatisticManager;
42+
import org.springframework.beans.factory.BeanCreationException;
43+
import org.springframework.beans.factory.ObjectProvider;
4244
import org.springframework.beans.factory.annotation.Autowired;
4345
import org.springframework.beans.factory.annotation.Qualifier;
4446
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
@@ -75,39 +77,41 @@ public class DomaAutoConfiguration {
7577

7678
@Bean
7779
@ConditionalOnMissingBean
78-
public Dialect dialect(JdbcConnectionDetails connectionDetails) {
80+
public Dialect dialect(ObjectProvider<JdbcConnectionDetails> connectionDetailsProvider) {
7981
DialectType dialectType = domaProperties.getDialect();
8082
if (dialectType != null) {
8183
return dialectType.create();
8284
}
83-
String url = connectionDetails.getJdbcUrl();
84-
if (url != null) {
85-
DatabaseDriver databaseDriver = DatabaseDriver.fromJdbcUrl(url);
86-
switch (databaseDriver) {
87-
case DB2:
88-
return new Db2Dialect();
89-
case H2:
90-
return new H2Dialect();
91-
case HSQLDB:
92-
return new HsqldbDialect();
93-
case SQLSERVER:
94-
case JTDS:
95-
return new MssqlDialect();
96-
case MYSQL:
97-
return new MysqlDialect();
98-
case ORACLE:
99-
return new OracleDialect();
100-
case POSTGRESQL:
101-
return new PostgresDialect();
102-
case SQLITE:
103-
return new SqliteDialect();
104-
default:
105-
break;
106-
}
85+
JdbcConnectionDetails connectionDetails = connectionDetailsProvider.getIfAvailable();
86+
if (connectionDetails == null) {
87+
throw new BeanCreationException(
88+
"No connection details available. You will probably have to set 'doma.dialect' explicitly.");
89+
}
90+
DatabaseDriver databaseDriver = DatabaseDriver.fromJdbcUrl(connectionDetails.getJdbcUrl());
91+
switch (databaseDriver) {
92+
case DB2:
93+
return new Db2Dialect();
94+
case H2:
95+
return new H2Dialect();
96+
case HSQLDB:
97+
return new HsqldbDialect();
98+
case SQLSERVER:
99+
case JTDS:
100+
return new MssqlDialect();
101+
case MYSQL:
102+
return new MysqlDialect();
103+
case ORACLE:
104+
return new OracleDialect();
105+
case POSTGRESQL:
106+
return new PostgresDialect();
107+
case SQLITE:
108+
return new SqliteDialect();
109+
default:
110+
break;
107111
}
108112
if (logger.isWarnEnabled()) {
109113
logger.warn(
110-
"StandardDialect was selected because no explicit configuration and it is not possible to guess from 'spring.datasource.url property'");
114+
"StandardDialect was selected because no explicit configuration and it is not possible to guess from the connection details.");
111115
}
112116
return new StandardDialect();
113117
}

doma-spring-boot-autoconfigure/src/test/java/org/seasar/doma/boot/autoconfigure/DomaAutoConfigurationTest.java

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package org.seasar.doma.boot.autoconfigure;
22

3+
import static org.hamcrest.CoreMatchers.containsString;
34
import static org.hamcrest.CoreMatchers.instanceOf;
45
import static org.hamcrest.CoreMatchers.is;
56
import static org.hamcrest.CoreMatchers.notNullValue;
67
import static org.hamcrest.MatcherAssert.assertThat;
78
import static org.junit.jupiter.api.Assertions.assertEquals;
89
import static org.junit.jupiter.api.Assertions.assertFalse;
910
import static org.junit.jupiter.api.Assertions.assertNotNull;
11+
import static org.junit.jupiter.api.Assertions.assertThrows;
1012
import static org.junit.jupiter.api.Assertions.assertTrue;
1113
import static org.mockito.ArgumentMatchers.anyString;
1214
import static org.mockito.Mockito.mock;
@@ -55,6 +57,7 @@
5557
import org.seasar.doma.jdbc.statistic.DefaultStatisticManager;
5658
import org.seasar.doma.jdbc.statistic.StatisticManager;
5759
import org.seasar.doma.message.Message;
60+
import org.springframework.beans.factory.BeanCreationException;
5861
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
5962
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
6063
import org.springframework.boot.autoconfigure.jdbc.JdbcConnectionDetails;
@@ -69,6 +72,7 @@
6972
import org.springframework.dao.DataIntegrityViolationException;
7073
import org.springframework.dao.QueryTimeoutException;
7174
import org.springframework.dao.support.PersistenceExceptionTranslator;
75+
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
7276
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
7377

7478
public class DomaAutoConfigurationTest {
@@ -279,8 +283,6 @@ public void testDialectByJdbConnectionDetails() {
279283
sources.addFirst(new MapPropertySource("test",
280284
Map.of("doma.exception-translation-enabled",
281285
"false"/* prevent database connections */)));
282-
EnvironmentTestUtils.addEnvironment(this.context,
283-
"doma.exception-translation-enabled:false"); // Prevent database connections
284286
this.context.register(DomaAutoConfiguration.class, DataSourceAutoConfiguration.class);
285287
this.context.registerBean(JdbcConnectionDetails.class, () -> new JdbcConnectionDetails() {
286288
@Override
@@ -303,6 +305,37 @@ public String getJdbcUrl() {
303305
assertThat(dialect, is(instanceOf(PostgresDialect.class)));
304306
}
305307

308+
@Test
309+
public void testDialectMissingJdbConnectionDetails() {
310+
MutablePropertySources sources = context.getEnvironment()
311+
.getPropertySources();
312+
sources.addFirst(new MapPropertySource("test",
313+
Map.of("doma.exception-translation-enabled",
314+
"false"/* prevent database connections */)));
315+
this.context.register(DomaAutoConfiguration.class, DataSourceAutoConfiguration.class);
316+
this.context.registerBean(DataSource.class, SimpleDriverDataSource::new);
317+
BeanCreationException exception = assertThrows(BeanCreationException.class,
318+
() -> this.context.refresh());
319+
assertThat(exception.getMessage(), containsString(
320+
"No connection details available. You will probably have to set 'doma.dialect' explicitly."));
321+
//Dialect dialect = this.context.getBean(Dialect.class);
322+
//assertThat(dialect, is(instanceOf(PostgresDialect.class)));
323+
}
324+
325+
@Test
326+
public void testDialectMissingJdbConnectionDetailsExplicitDialect() {
327+
MutablePropertySources sources = context.getEnvironment()
328+
.getPropertySources();
329+
sources.addFirst(new MapPropertySource("test",
330+
Map.of("doma.dialect", "POSTGRES", "doma.exception-translation-enabled",
331+
"false"/* prevent database connections */)));
332+
this.context.register(DomaAutoConfiguration.class, DataSourceAutoConfiguration.class);
333+
this.context.registerBean(DataSource.class, SimpleDriverDataSource::new);
334+
this.context.refresh();
335+
Dialect dialect = this.context.getBean(Dialect.class);
336+
assertThat(dialect, is(instanceOf(PostgresDialect.class)));
337+
}
338+
306339
@Test
307340
public void testDialectByDomaPropertiesIgnoreDataSourceUrl() {
308341
MutablePropertySources sources = context.getEnvironment()

0 commit comments

Comments
 (0)