|
|
|
@ -43,7 +43,7 @@ import org.springframework.dao.RecoverableDataAccessException; |
|
|
|
import org.springframework.dao.TransientDataAccessResourceException; |
|
|
|
import org.springframework.dao.TransientDataAccessResourceException; |
|
|
|
import org.springframework.jdbc.BadSqlGrammarException; |
|
|
|
import org.springframework.jdbc.BadSqlGrammarException; |
|
|
|
|
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat; |
|
|
|
import static org.springframework.jdbc.support.SQLStateSQLExceptionTranslatorTests.buildBatchUpdateException; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* @author Thomas Risberg |
|
|
|
* @author Thomas Risberg |
|
|
|
@ -51,43 +51,50 @@ import static org.assertj.core.api.Assertions.assertThat; |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
class SQLExceptionSubclassTranslatorTests { |
|
|
|
class SQLExceptionSubclassTranslatorTests { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final SQLExceptionTranslator translator = new SQLExceptionSubclassTranslator(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void exceptionClassTranslation() { |
|
|
|
void exceptionClassTranslation() { |
|
|
|
doTest(new SQLDataException("", "", 0), DataIntegrityViolationException.class); |
|
|
|
assertTranslation(new SQLDataException("", "", 0), DataIntegrityViolationException.class); |
|
|
|
doTest(new SQLFeatureNotSupportedException("", "", 0), InvalidDataAccessApiUsageException.class); |
|
|
|
assertTranslation(new SQLFeatureNotSupportedException("", "", 0), InvalidDataAccessApiUsageException.class); |
|
|
|
doTest(new SQLIntegrityConstraintViolationException("", "", 0), DataIntegrityViolationException.class); |
|
|
|
assertTranslation(new SQLIntegrityConstraintViolationException("", "", 0), DataIntegrityViolationException.class); |
|
|
|
doTest(new SQLIntegrityConstraintViolationException("", "23505", 0), DuplicateKeyException.class); |
|
|
|
assertTranslation(new SQLIntegrityConstraintViolationException("", "23505", 0), DuplicateKeyException.class); |
|
|
|
doTest(new SQLIntegrityConstraintViolationException("", "23000", 1), DuplicateKeyException.class); |
|
|
|
assertTranslation(new SQLIntegrityConstraintViolationException("", "23000", 1), DuplicateKeyException.class); |
|
|
|
doTest(new SQLIntegrityConstraintViolationException("", "23000", 1062), DuplicateKeyException.class); |
|
|
|
assertTranslation(new SQLIntegrityConstraintViolationException("", "23000", 1062), DuplicateKeyException.class); |
|
|
|
doTest(new SQLIntegrityConstraintViolationException("", "23000", 2601), DuplicateKeyException.class); |
|
|
|
assertTranslation(new SQLIntegrityConstraintViolationException("", "23000", 2601), DuplicateKeyException.class); |
|
|
|
doTest(new SQLIntegrityConstraintViolationException("", "23000", 2627), DuplicateKeyException.class); |
|
|
|
assertTranslation(new SQLIntegrityConstraintViolationException("", "23000", 2627), DuplicateKeyException.class); |
|
|
|
doTest(new SQLInvalidAuthorizationSpecException("", "", 0), PermissionDeniedDataAccessException.class); |
|
|
|
assertTranslation(new SQLInvalidAuthorizationSpecException("", "", 0), PermissionDeniedDataAccessException.class); |
|
|
|
doTest(new SQLNonTransientConnectionException("", "", 0), DataAccessResourceFailureException.class); |
|
|
|
assertTranslation(new SQLNonTransientConnectionException("", "", 0), DataAccessResourceFailureException.class); |
|
|
|
doTest(new SQLRecoverableException("", "", 0), RecoverableDataAccessException.class); |
|
|
|
assertTranslation(new SQLRecoverableException("", "", 0), RecoverableDataAccessException.class); |
|
|
|
doTest(new SQLSyntaxErrorException("", "", 0), BadSqlGrammarException.class); |
|
|
|
assertTranslation(new SQLSyntaxErrorException("", "", 0), BadSqlGrammarException.class); |
|
|
|
doTest(new SQLTimeoutException("", "", 0), QueryTimeoutException.class); |
|
|
|
assertTranslation(new SQLTimeoutException("", "", 0), QueryTimeoutException.class); |
|
|
|
doTest(new SQLTransactionRollbackException("", "", 0), PessimisticLockingFailureException.class); |
|
|
|
assertTranslation(new SQLTransactionRollbackException("", "", 0), PessimisticLockingFailureException.class); |
|
|
|
doTest(new SQLTransactionRollbackException("", "40001", 0), CannotAcquireLockException.class); |
|
|
|
assertTranslation(new SQLTransactionRollbackException("", "40001", 0), CannotAcquireLockException.class); |
|
|
|
doTest(new SQLTransientConnectionException("", "", 0), TransientDataAccessResourceException.class); |
|
|
|
assertTranslation(new SQLTransientConnectionException("", "", 0), TransientDataAccessResourceException.class); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void batchExceptionTranslation() { |
|
|
|
|
|
|
|
assertTranslation(buildBatchUpdateException("JZ", new SQLIntegrityConstraintViolationException("", "23505", 0)), |
|
|
|
|
|
|
|
DuplicateKeyException.class); |
|
|
|
|
|
|
|
assertTranslation(buildBatchUpdateException(null, new SQLIntegrityConstraintViolationException("", "23505", 0)), |
|
|
|
|
|
|
|
DuplicateKeyException.class); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void fallbackStateTranslation() { |
|
|
|
void fallbackStateTranslation() { |
|
|
|
// Test fallback. We assume that no database will ever return this error code,
|
|
|
|
// Test fallback. We assume that no database will ever return this error code,
|
|
|
|
// but 07xxx will be bad grammar picked up by the fallback SQLState translator
|
|
|
|
// but 07xxx will be bad grammar picked up by the fallback SQLState translator
|
|
|
|
doTest(new SQLException("", "07xxx", 666666666), BadSqlGrammarException.class); |
|
|
|
assertTranslation(new SQLException("", "07xxx", 666666666), BadSqlGrammarException.class); |
|
|
|
// and 08xxx will be data resource failure (non-transient) picked up by the fallback SQLState translator
|
|
|
|
// and 08xxx will be data resource failure (non-transient) picked up by the fallback SQLState translator
|
|
|
|
doTest(new SQLException("", "08xxx", 666666666), DataAccessResourceFailureException.class); |
|
|
|
assertTranslation(new SQLException("", "08xxx", 666666666), DataAccessResourceFailureException.class); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void doTest(SQLException ex, Class<?> dataAccessExceptionType) { |
|
|
|
private void assertTranslation(SQLException ex, Class<?> dataAccessExceptionType) { |
|
|
|
SQLExceptionTranslator translator = new SQLExceptionSubclassTranslator(); |
|
|
|
DataAccessException dae = translator.translate("task", "SQL", ex); |
|
|
|
DataAccessException dax = translator.translate("task", "SQL", ex); |
|
|
|
SQLStateSQLExceptionTranslatorTests.assertTranslation(dae, ex, dataAccessExceptionType); |
|
|
|
|
|
|
|
|
|
|
|
assertThat(dax).as("Specific translation must not result in null").isNotNull(); |
|
|
|
|
|
|
|
assertThat(dax).as("Wrong DataAccessException type returned").isExactlyInstanceOf(dataAccessExceptionType); |
|
|
|
|
|
|
|
assertThat(dax.getCause()).as("The exact same original SQLException must be preserved").isSameAs(ex); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|