diff --git a/src/main/java/org/apache/ibatis/executor/result/ResultClassTypeHolder.java b/src/main/java/org/apache/ibatis/executor/result/ResultClassTypeHolder.java new file mode 100644 index 00000000000..c689f268672 --- /dev/null +++ b/src/main/java/org/apache/ibatis/executor/result/ResultClassTypeHolder.java @@ -0,0 +1,19 @@ +package org.apache.ibatis.executor.result; + +public class ResultClassTypeHolder { + + // hold the the class type of result + private static final ThreadLocal resultTypeTl = new ThreadLocal(); + + public static void setResultType(Class clazz) { + resultTypeTl.set(clazz); + } + + public static Class getResultType() { + return resultTypeTl.get(); + } + + public static void clean() { + resultTypeTl.remove(); + } +} diff --git a/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java b/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java index 5e5461b3b71..5a8b844c883 100644 --- a/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java +++ b/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java @@ -41,6 +41,7 @@ import org.apache.ibatis.executor.parameter.ParameterHandler; import org.apache.ibatis.executor.result.DefaultResultContext; import org.apache.ibatis.executor.result.DefaultResultHandler; +import org.apache.ibatis.executor.result.ResultClassTypeHolder; import org.apache.ibatis.executor.result.ResultMapException; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.Discriminator; @@ -293,6 +294,7 @@ private void validateResultMapsCount(ResultSetWrapper rsw, int resultMapCount) { private void handleResultSet(ResultSetWrapper rsw, ResultMap resultMap, List multipleResults, ResultMapping parentMapping) throws SQLException { try { + ResultClassTypeHolder.setResultType(resultMap.getType()); if (parentMapping != null) { handleRowValues(rsw, resultMap, null, RowBounds.DEFAULT, parentMapping); } else { @@ -307,6 +309,7 @@ private void handleResultSet(ResultSetWrapper rsw, ResultMap resultMap, List { diff --git a/src/test/java/org/apache/ibatis/builder/typehandler/WidthTypeHandler.java b/src/test/java/org/apache/ibatis/builder/typehandler/WidthTypeHandler.java new file mode 100644 index 00000000000..a2321d0a399 --- /dev/null +++ b/src/test/java/org/apache/ibatis/builder/typehandler/WidthTypeHandler.java @@ -0,0 +1,36 @@ +package org.apache.ibatis.builder.typehandler; + +import org.apache.ibatis.autoconstructor.BadSubject; +import org.apache.ibatis.executor.result.ResultClassTypeHolder; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.junit.Assert; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WidthTypeHandler extends BaseTypeHandler { + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, BadSubject.Width parameter, JdbcType jdbcType) throws SQLException { + + } + + @Override + public BadSubject.Width getNullableResult(ResultSet rs, String columnName) throws SQLException { + Assert.assertNotNull(ResultClassTypeHolder.getResultType()); + return new BadSubject.Width(); + } + + @Override + public BadSubject.Width getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + return new BadSubject.Width(); + } + + @Override + public BadSubject.Width getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + return new BadSubject.Width(); + } +} diff --git a/src/test/java/org/apache/ibatis/executor/ResultClassTypeHolderTest.java b/src/test/java/org/apache/ibatis/executor/ResultClassTypeHolderTest.java new file mode 100644 index 00000000000..0335cd98c87 --- /dev/null +++ b/src/test/java/org/apache/ibatis/executor/ResultClassTypeHolderTest.java @@ -0,0 +1,25 @@ +package org.apache.ibatis.executor; + +import org.apache.ibatis.executor.result.ResultClassTypeHolder; +import org.junit.Assert; +import org.junit.jupiter.api.Test; + +public class ResultClassTypeHolderTest { + + @Test + public void getResultClassFromTl() { + try { + ResultClassTypeHolder.setResultType(Object.class); + getResultClass(); + }finally { + ResultClassTypeHolder.clean(); + } + + } + + private void getResultClass() { + Class aClass = ResultClassTypeHolder.getResultType(); + Assert.assertNotNull(aClass); + } + +}