From 595abff17054ee62e15cb3af33b638fc815c179a 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 67f834439..cb74fe826 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); } } @@ -460,7 +470,7 @@ implements InitializingBean { } catch (SQLException se) { close(); - throw getExceptionTranslator().translate("Executing query", getSql(), se); + throw translateSqlException("Executing query", getSql(), se); } } @@ -487,7 +497,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 2caef4de1..920b785c3 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 f20bbb556..e5341ea8f 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); } }