Translate MongoSocketException subclasses to DataAccessResourceFailureException.

Closes #3568
Original pull request: #3569.
This commit is contained in:
Brice Vandeputte
2021-02-25 12:01:30 +01:00
committed by Mark Paluch
parent fcd48539ea
commit bf642ad3f7
2 changed files with 31 additions and 4 deletions

View File

@@ -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);
}

View File

@@ -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())),