From 39e301d98dd227f725b78fbcef4259662e87ea4d Mon Sep 17 00:00:00 2001 From: Brice Vandeputte Date: Thu, 25 Feb 2021 12:01:30 +0100 Subject: [PATCH] Translate MongoSocketException subclasses to DataAccessResourceFailureException. Closes #3568 Original pull request: #3569. --- .../core/MongoExceptionTranslator.java | 7 +++++ .../MongoExceptionTranslatorUnitTests.java | 28 ++++++++++++++++--- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoExceptionTranslator.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoExceptionTranslator.java index 4c7d090f7..8be03ec79 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoExceptionTranslator.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoExceptionTranslator.java @@ -15,6 +15,7 @@ */ package org.springframework.data.mongodb.core; +import com.mongodb.MongoSocketException; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; @@ -49,6 +50,7 @@ import com.mongodb.bulk.BulkWriteError; * @author Oliver Gierke * @author Michal Vich * @author Christoph Strobl + * @author Brice Vandeputte */ public class MongoExceptionTranslator implements PersistenceExceptionTranslator { @@ -78,6 +80,10 @@ public class MongoExceptionTranslator implements PersistenceExceptionTranslator throw new InvalidDataAccessApiUsageException(ex.getMessage(), ex); } + if (ex instanceof MongoSocketException) { + return new DataAccessResourceFailureException(ex.getMessage(), ex); + } + String exception = ClassUtils.getShortName(ClassUtils.getUserClass(ex.getClass())); if (DUPLICATE_KEY_EXCEPTIONS.contains(exception)) { @@ -88,6 +94,7 @@ public class MongoExceptionTranslator implements PersistenceExceptionTranslator return new DataAccessResourceFailureException(ex.getMessage(), ex); } + if (RESOURCE_USAGE_EXCEPTIONS.contains(exception)) { return new InvalidDataAccessResourceUsageException(ex.getMessage(), ex); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoExceptionTranslatorUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoExceptionTranslatorUnitTests.java index cfa75ba08..70e573edd 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoExceptionTranslatorUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoExceptionTranslatorUnitTests.java @@ -17,7 +17,8 @@ package org.springframework.data.mongodb.core; import static org.assertj.core.api.Assertions.*; -import java.net.UnknownHostException; +import com.mongodb.MongoSocketReadTimeoutException; +import com.mongodb.MongoSocketWriteException; import org.bson.BsonDocument; import org.junit.jupiter.api.BeforeEach; @@ -45,9 +46,11 @@ import com.mongodb.ServerAddress; * @author Michal Vich * @author Oliver Gierke * @author Christoph Strobl + * @author Brice Vandeputte */ public class MongoExceptionTranslatorUnitTests { + public static final String EXCEPTION_MESSAGE = "IOException"; MongoExceptionTranslator translator; @BeforeEach @@ -68,13 +71,30 @@ public class MongoExceptionTranslatorUnitTests { public void translateSocketException() { expectExceptionWithCauseMessage( - translator.translateExceptionIfPossible(new MongoSocketException("IOException", new ServerAddress())), - DataAccessResourceFailureException.class, "IOException"); + translator.translateExceptionIfPossible(new MongoSocketException(EXCEPTION_MESSAGE, new ServerAddress())), + DataAccessResourceFailureException.class, EXCEPTION_MESSAGE); + + } + + @Test // GH-3568 + public void translateSocketChildrenExceptions() { + + expectExceptionWithCauseMessage( + translator.translateExceptionIfPossible( + new MongoSocketWriteException("intermediate message", new ServerAddress(), new Exception(EXCEPTION_MESSAGE)) + ), + DataAccessResourceFailureException.class, EXCEPTION_MESSAGE); + + expectExceptionWithCauseMessage( + translator.translateExceptionIfPossible( + new MongoSocketReadTimeoutException("intermediate message", new ServerAddress(), new Exception(EXCEPTION_MESSAGE)) + ), + DataAccessResourceFailureException.class, EXCEPTION_MESSAGE); } @Test - public void translateCursorNotFound() throws UnknownHostException { + public void translateCursorNotFound() { expectExceptionWithCauseMessage( translator.translateExceptionIfPossible(new MongoCursorNotFoundException(1L, new ServerAddress())),