From 75b7aff80afffc911b13552541a209407d4ded39 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 6 Dec 2011 15:15:13 +0100 Subject: [PATCH] DATAMONGO-318 - Don't throw exceptions for updates not affecting any documents. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Throwing an exception if an update does not affect any documents doesn't make sense in all cases. Removed throwing an exception by default but made the relevant method (handleAnyWriteResultErrors(…)) protected so that subclasses might override this behavior. --- .../data/mongodb/core/MongoTemplate.java | 21 ++++++++----------- .../data/mongodb/core/MongoTemplateTests.java | 6 +----- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index a19a4f024..3daba8b01 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -1468,27 +1468,24 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { * Current implementation logs errors. Future version may make this configurable to log warning, errors or throw * exception. */ - private void handleAnyWriteResultErrors(WriteResult wr, DBObject query, String operation) { + protected void handleAnyWriteResultErrors(WriteResult wr, DBObject query, String operation) { + if (WriteResultChecking.NONE == this.writeResultChecking) { return; } + String error = wr.getError(); - int n = wr.getN(); + if (error != null) { - String message = "Execution of '" + operation + (query == null ? "" : "' using '" + query.toString() + "' query") - + " failed: " + error; + + String message = String.format("Execution of %s%s failed: %s", operation, query == null ? "" : "' using '" + + query.toString() + "' query", error); + if (WriteResultChecking.EXCEPTION == this.writeResultChecking) { throw new DataIntegrityViolationException(message); } else { LOGGER.error(message); - } - } else if (n == 0) { - String message = "Execution of '" + operation + (query == null ? "" : "' using '" + query.toString() + "' query") - + " did not succeed: 0 documents updated"; - if (WriteResultChecking.EXCEPTION == this.writeResultChecking) { - throw new DataIntegrityViolationException(message); - } else { - LOGGER.warn(message); + return; } } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java index 4a9d611d0..74c29238b 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java @@ -39,7 +39,6 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.convert.converter.Converter; import org.springframework.dao.DataAccessException; -import org.springframework.dao.DataIntegrityViolationException; import org.springframework.data.annotation.PersistenceConstructor; import org.springframework.data.mongodb.InvalidMongoDbApiUsageException; import org.springframework.data.mongodb.MongoDbFactory; @@ -145,7 +144,7 @@ public class MongoTemplateTests { } @Test - public void updateFailure() throws Exception { + public void bogusUpdateDoesNotTriggerException() throws Exception { MongoTemplate mongoTemplate = new MongoTemplate(factory); mongoTemplate.setWriteResultChecking(WriteResultChecking.EXCEPTION); @@ -156,10 +155,7 @@ public class MongoTemplateTests { Query q = new Query(Criteria.where("BOGUS").gt(22)); Update u = new Update().set("firstName", "Sven"); - thrown.expect(DataIntegrityViolationException.class); - thrown.expectMessage(endsWith("0 documents updated")); mongoTemplate.updateFirst(q, u, Person.class); - } @Test