diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/JooqExceptionTranslator.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/JooqExceptionTranslator.java index 075934c882bb..c241c59aa6e7 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/JooqExceptionTranslator.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/JooqExceptionTranslator.java @@ -25,6 +25,7 @@ import org.jooq.impl.DefaultExecuteListener; import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.UncategorizedSQLException; import org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator; import org.springframework.jdbc.support.SQLExceptionTranslator; import org.springframework.jdbc.support.SQLStateSQLExceptionTranslator; @@ -80,6 +81,9 @@ private SQLExceptionTranslator getTranslator(ExecuteContext context) { private void handle(ExecuteContext context, SQLExceptionTranslator translator, SQLException exception) { DataAccessException translated = translate(context, translator, exception); if (exception.getNextException() == null) { + if (translated == null) { + translated = new UncategorizedSQLException("jOOQ", context.sql(), exception); + } context.exception(translated); } else { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jooq/JooqExceptionTranslatorTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jooq/JooqExceptionTranslatorTests.java index ea88b1c7efb5..14acd4fd2bd4 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jooq/JooqExceptionTranslatorTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jooq/JooqExceptionTranslatorTests.java @@ -26,6 +26,7 @@ import org.mockito.ArgumentCaptor; import org.springframework.jdbc.BadSqlGrammarException; +import org.springframework.jdbc.UncategorizedSQLException; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; @@ -41,9 +42,10 @@ class JooqExceptionTranslatorTests { private final JooqExceptionTranslator exceptionTranslator = new JooqExceptionTranslator(); - @ParameterizedTest(name = "{0}") + @ParameterizedTest(name = "{0} {2}") @MethodSource - void exceptionTranslation(SQLDialect dialect, SQLException sqlException) { + void exceptionTranslation(SQLDialect dialect, SQLException sqlException, + Class expectedExceptionClass) { ExecuteContext context = mock(ExecuteContext.class); Configuration configuration = mock(Configuration.class); given(context.configuration()).willReturn(configuration); @@ -52,17 +54,18 @@ void exceptionTranslation(SQLDialect dialect, SQLException sqlException) { this.exceptionTranslator.exception(context); ArgumentCaptor captor = ArgumentCaptor.forClass(RuntimeException.class); verify(context).exception(captor.capture()); - assertThat(captor.getValue()).isInstanceOf(BadSqlGrammarException.class); + assertThat(captor.getValue()).isInstanceOf(expectedExceptionClass); } static Object[] exceptionTranslation() { - return new Object[] { new Object[] { SQLDialect.DERBY, sqlException("42802") }, - new Object[] { SQLDialect.H2, sqlException(42000) }, - new Object[] { SQLDialect.HSQLDB, sqlException(-22) }, - new Object[] { SQLDialect.MARIADB, sqlException(1054) }, - new Object[] { SQLDialect.MYSQL, sqlException(1054) }, - new Object[] { SQLDialect.POSTGRES, sqlException("03000") }, - new Object[] { SQLDialect.SQLITE, sqlException("21000") } }; + return new Object[] { new Object[] { SQLDialect.DERBY, sqlException("42802"), BadSqlGrammarException.class }, + new Object[] { SQLDialect.H2, sqlException(42000), BadSqlGrammarException.class }, + new Object[] { SQLDialect.HSQLDB, sqlException(-22), BadSqlGrammarException.class }, + new Object[] { SQLDialect.MARIADB, sqlException(1054), BadSqlGrammarException.class }, + new Object[] { SQLDialect.MYSQL, sqlException(1054), BadSqlGrammarException.class }, + new Object[] { SQLDialect.POSTGRES, sqlException("03000"), BadSqlGrammarException.class }, + new Object[] { SQLDialect.SQLITE, sqlException("21000"), BadSqlGrammarException.class }, + new Object[] { SQLDialect.DEFAULT, sqlException(null), UncategorizedSQLException.class } }; } private static SQLException sqlException(String sqlState) {