From c90aa63ca31f564b081a02af10f6571c0bf415ce Mon Sep 17 00:00:00 2001 From: Ilya Samartsev Date: Thu, 29 Jul 2021 14:16:50 +0300 Subject: [PATCH] Fix NPE in sql exception translation Resolves #3968 --- .../item/database/AbstractCursorItemReader.java | 16 +++++++++++++--- .../item/database/JdbcCursorItemReader.java | 2 +- .../item/database/StoredProcedureItemReader.java | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/AbstractCursorItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/AbstractCursorItemReader.java index aefc8f6a9..b913c2930 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/AbstractCursorItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/AbstractCursorItemReader.java @@ -32,9 +32,11 @@ import org.springframework.batch.item.ItemStream; import org.springframework.batch.item.ReaderNotOpenException; import org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader; import org.springframework.beans.factory.InitializingBean; +import org.springframework.dao.DataAccessException; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.dao.InvalidDataAccessResourceUsageException; import org.springframework.jdbc.SQLWarningException; +import org.springframework.jdbc.UncategorizedSQLException; import org.springframework.jdbc.datasource.DataSourceUtils; import org.springframework.jdbc.support.JdbcUtils; import org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator; @@ -220,6 +222,14 @@ implements InitializingBean { return exceptionTranslator; } + protected DataAccessException translateSqlException(String task, String sql, SQLException ex) { + DataAccessException dae = getExceptionTranslator().translate(task, sql, ex); + if (dae != null) { + return dae; + } + return new UncategorizedSQLException(task, sql, ex); + } + /** * Throw a SQLWarningException if we're not ignoring warnings, else log the * warnings (at debug level). @@ -262,7 +272,7 @@ implements InitializingBean { } } catch (SQLException se) { - throw getExceptionTranslator().translate("Attempted to move ResultSet to last committed row", getSql(), se); + throw translateSqlException("Attempted to move ResultSet to last committed row", getSql(), se); } } @@ -470,7 +480,7 @@ implements InitializingBean { } catch (SQLException se) { close(); - throw getExceptionTranslator().translate("Executing query", getSql(), se); + throw translateSqlException("Executing query", getSql(), se); } } @@ -497,7 +507,7 @@ implements InitializingBean { return item; } catch (SQLException se) { - throw getExceptionTranslator().translate("Attempt to process next row failed", getSql(), se); + throw translateSqlException("Attempt to process next row failed", getSql(), se); } } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcCursorItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcCursorItemReader.java index 3e2c8ade8..f8cfa7f1e 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcCursorItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcCursorItemReader.java @@ -130,7 +130,7 @@ public class JdbcCursorItemReader extends AbstractCursorItemReader { } catch (SQLException se) { close(); - throw getExceptionTranslator().translate("Executing query", getSql(), se); + throw translateSqlException("Executing query", getSql(), se); } } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/StoredProcedureItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/StoredProcedureItemReader.java index 08079dabc..076161263 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/StoredProcedureItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/StoredProcedureItemReader.java @@ -227,7 +227,7 @@ public class StoredProcedureItemReader extends AbstractCursorItemReader { } catch (SQLException se) { close(); - throw getExceptionTranslator().translate("Executing stored procedure", getSql(), se); + throw translateSqlException("Executing stored procedure", getSql(), se); } }