Skip to content

Commit 6695009

Browse files
kazuki43zoomaking
authored andcommitted
Modify to use the SQLErrorCodeSQLExceptionTranslator
gh-10
1 parent f28151f commit 6695009

File tree

3 files changed

+52
-4
lines changed

3 files changed

+52
-4
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.springframework.context.annotation.Bean;
3131
import org.springframework.context.annotation.Configuration;
3232
import org.springframework.dao.support.PersistenceExceptionTranslator;
33+
import org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator;
3334

3435
import javax.sql.DataSource;
3536

@@ -40,6 +41,7 @@
4041
* Auto-configuration} for Doma.
4142
*
4243
* @author Toshiaki Maki
44+
* @author Kazuki Shimizu
4345
*/
4446
@Configuration
4547
@ConditionalOnClass(Config.class)
@@ -57,8 +59,8 @@ public Dialect dialect() {
5759

5860
@Bean
5961
@ConditionalOnProperty(prefix = DomaProperties.DOMA_PREFIX, name = "exception-translation-enabled", matchIfMissing = true)
60-
public PersistenceExceptionTranslator exceptionTranslator() {
61-
return new DomaPersistenceExceptionTranslator();
62+
public PersistenceExceptionTranslator exceptionTranslator(Config config) {
63+
return new DomaPersistenceExceptionTranslator(new SQLErrorCodeSQLExceptionTranslator(config.getDataSource()));
6264
}
6365

6466
@Bean

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,20 @@
2020
import org.seasar.doma.jdbc.*;
2121
import org.springframework.dao.*;
2222
import org.springframework.dao.support.PersistenceExceptionTranslator;
23-
import org.springframework.jdbc.support.SQLExceptionSubclassTranslator;
2423
import org.springframework.jdbc.support.SQLExceptionTranslator;
2524

2625
/**
2726
* Converts Doma's {@link JdbcException} into Spring's {@link DataAccessException}.
2827
* @author Toshiaki Maki
28+
* @author Kazuki Shimizu
2929
*/
3030
public class DomaPersistenceExceptionTranslator implements PersistenceExceptionTranslator {
31-
private final SQLExceptionTranslator translator = new SQLExceptionSubclassTranslator();
31+
32+
private final SQLExceptionTranslator translator;
33+
34+
public DomaPersistenceExceptionTranslator(SQLExceptionTranslator sqlExceptionTranslator) {
35+
this.translator = sqlExceptionTranslator;
36+
}
3237

3338
@Override
3439
public DataAccessException translateExceptionIfPossible(RuntimeException ex) {

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

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,23 @@
2323
import org.seasar.doma.jdbc.dialect.MysqlDialect;
2424
import org.seasar.doma.jdbc.dialect.PostgresDialect;
2525
import org.seasar.doma.jdbc.dialect.StandardDialect;
26+
import org.seasar.doma.message.Message;
2627
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
2728
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
2829
import org.springframework.context.annotation.Bean;
2930
import org.springframework.context.annotation.Configuration;
31+
import org.springframework.dao.CannotAcquireLockException;
32+
import org.springframework.dao.DataAccessException;
33+
import org.springframework.dao.DataIntegrityViolationException;
34+
import org.springframework.dao.QueryTimeoutException;
35+
import org.springframework.dao.support.PersistenceExceptionTranslator;
3036
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
3137

3238
import javax.sql.DataSource;
3339

40+
import java.sql.SQLException;
41+
import java.sql.SQLTimeoutException;
42+
3443
import static org.junit.Assert.*;
3544
import static org.hamcrest.CoreMatchers.*;
3645

@@ -56,6 +65,8 @@ public void testAutoRegisteredConfig() {
5665
is(instanceOf(GreedyCacheSqlFileRepository.class)));
5766
assertThat(config.getNaming(), is(Naming.DEFAULT));
5867
assertThat(config.getJdbcLogger(), is(instanceOf(UtilLoggingJdbcLogger.class)));
68+
PersistenceExceptionTranslator translator = this.context.getBean(PersistenceExceptionTranslator.class);
69+
assertThat(translator,is(instanceOf(DomaPersistenceExceptionTranslator.class)));
5970
}
6071

6172
@Test
@@ -72,6 +83,8 @@ public void testConfigWithDomaConfigBuilder() {
7283
is(instanceOf(NoCacheSqlFileRepository.class)));
7384
assertThat(config.getNaming(), is(Naming.SNAKE_UPPER_CASE));
7485
assertThat(config.getJdbcLogger(), is(instanceOf(UtilLoggingJdbcLogger.class)));
86+
PersistenceExceptionTranslator translator = this.context.getBean(PersistenceExceptionTranslator.class);
87+
assertThat(translator,is(instanceOf(DomaPersistenceExceptionTranslator.class)));
7588
}
7689

7790
@Test
@@ -88,6 +101,34 @@ public void testConfigWithConfig() {
88101
is(instanceOf(NoCacheSqlFileRepository.class)));
89102
assertThat(config.getNaming(), is(Naming.SNAKE_LOWER_CASE));
90103
assertThat(config.getJdbcLogger(), is(instanceOf(UtilLoggingJdbcLogger.class)));
104+
PersistenceExceptionTranslator translator = this.context.getBean(PersistenceExceptionTranslator.class);
105+
assertThat(translator,is(instanceOf(DomaPersistenceExceptionTranslator.class)));
106+
}
107+
108+
@Test
109+
public void testSQLExceptionTranslator() {
110+
this.context.register(DomaAutoConfiguration.class,
111+
DataSourceAutoConfiguration.class);
112+
this.context.refresh();
113+
PersistenceExceptionTranslator translator = this.context.getBean(PersistenceExceptionTranslator.class);
114+
{
115+
// Translated by SQLErrorCodeSQLExceptionTranslator
116+
DataAccessException dataAccessException = translator.translateExceptionIfPossible(
117+
new JdbcException(Message.DOMA2008, new SQLException("Acquire Lock on H2", "SqlState", 50200, null)));
118+
assertThat(dataAccessException, is(instanceOf(CannotAcquireLockException.class)));
119+
}
120+
{
121+
// Translated by SQLExceptionSubclassTranslator(fallback)
122+
DataAccessException dataAccessException = translator.translateExceptionIfPossible(
123+
new JdbcException(Message.DOMA2008, new SQLTimeoutException("Timeout", "SqlState", -1, null)));
124+
assertThat(dataAccessException, is(instanceOf(QueryTimeoutException.class)));
125+
}
126+
{
127+
// Translated by SQLStateSQLExceptionTranslator (fallback)
128+
DataAccessException dataAccessException = translator.translateExceptionIfPossible(
129+
new JdbcException(Message.DOMA2008, new SQLException("With check violation", "44", -1, null)));
130+
assertThat(dataAccessException, is(instanceOf(DataIntegrityViolationException.class)));
131+
}
91132
}
92133

93134
@After

0 commit comments

Comments
 (0)