diff --git a/src/main/java/org/apache/ibatis/builder/annotation/ProviderSqlSource.java b/src/main/java/org/apache/ibatis/builder/annotation/ProviderSqlSource.java index 543fc9ceb28..22e4dfc97d4 100644 --- a/src/main/java/org/apache/ibatis/builder/annotation/ProviderSqlSource.java +++ b/src/main/java/org/apache/ibatis/builder/annotation/ProviderSqlSource.java @@ -173,7 +173,7 @@ private SqlSource createSqlSource(Object parameterObject) { private Throwable extractRootCause(Exception e) { Throwable cause = e; while(cause.getCause() != null) { - cause = e.getCause(); + cause = cause.getCause(); } return cause; } diff --git a/src/test/java/org/apache/ibatis/submitted/sqlprovider/SqlProviderTest.java b/src/test/java/org/apache/ibatis/submitted/sqlprovider/SqlProviderTest.java index 84aae6f938c..972e42f94d3 100644 --- a/src/test/java/org/apache/ibatis/submitted/sqlprovider/SqlProviderTest.java +++ b/src/test/java/org/apache/ibatis/submitted/sqlprovider/SqlProviderTest.java @@ -22,7 +22,6 @@ import static org.junit.jupiter.api.Assertions.fail; import java.io.Reader; -import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; @@ -391,6 +390,20 @@ void invokeError() throws NoSuchMethodException { } } + @Test + void invokeNestedError() throws NoSuchMethodException { + try { + Class mapperType = ErrorMapper.class; + Method mapperMethod = mapperType.getMethod("invokeNestedError"); + new ProviderSqlSource(new Configuration(), + mapperMethod.getAnnotation(SelectProvider.class), mapperType, mapperMethod) + .getBoundSql(new Object()); + fail(); + } catch (BuilderException e) { + assertTrue(e.getMessage().contains("Error invoking SqlProvider method 'public java.lang.String org.apache.ibatis.submitted.sqlprovider.SqlProviderTest$ErrorSqlBuilder.invokeNestedError()' with specify parameter 'class java.lang.Object'. Cause: java.lang.UnsupportedOperationException: invokeNestedError")); + } + } + @Test void invalidArgumentsCombination() throws NoSuchMethodException { try { @@ -670,6 +683,9 @@ public interface ErrorMapper { @SelectProvider(type = ErrorSqlBuilder.class, method = "invokeError") void invokeError(); + @SelectProvider(type = ErrorSqlBuilder.class, method = "invokeNestedError") + void invokeNestedError(); + @SelectProvider(type = ErrorSqlBuilder.class, method = "multipleProviderContext") void multipleProviderContext(); @@ -702,6 +718,10 @@ public String invokeError() { throw new UnsupportedOperationException("invokeError"); } + public String invokeNestedError() { + throw new IllegalStateException(new UnsupportedOperationException("invokeNestedError")); + } + public String multipleProviderContext(ProviderContext providerContext1, ProviderContext providerContext2) { throw new UnsupportedOperationException("multipleProviderContext"); }