DATAMONGO-1617 - BeforeConvertEvent is now emitted before updatable idendifier assertion.

We now make sure the BeforeConvertEvent is published before we check for identifier types that can potentially be auto-generated. That allows the event listeners to populate identifiers. Previously the identifier check kicked in before that and thus caused the listener not being able to populate the property.

Original pull request: #443.
This commit is contained in:
Laszlo Csontos
2017-02-22 06:51:14 +01:00
committed by Oliver Gierke
parent cd42b19718
commit 5de3cb9ba3
3 changed files with 116 additions and 7 deletions

View File

@@ -138,6 +138,7 @@ import com.mongodb.util.JSONParseException;
* @author Chuong Ngo
* @author Christoph Strobl
* @author Doménique Tilleuil
* @author Laszlo Csontos
*/
@SuppressWarnings("deprecation")
public class MongoTemplate implements MongoOperations, ApplicationContextAware {
@@ -828,12 +829,11 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware {
protected <T> void doInsert(String collectionName, T objectToSave, MongoWriter<T> writer) {
maybeEmitEvent(new BeforeConvertEvent<T>(objectToSave, collectionName));
assertUpdateableIdIfNotSet(objectToSave);
initializeVersionProperty(objectToSave);
maybeEmitEvent(new BeforeConvertEvent<T>(objectToSave, collectionName));
DBObject dbDoc = toDbObject(objectToSave, writer);
maybeEmitEvent(new BeforeSaveEvent<T>(objectToSave, dbDoc, collectionName));
@@ -985,6 +985,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware {
doInsert(collectionName, objectToSave, this.mongoConverter);
} else {
maybeEmitEvent(new BeforeConvertEvent<T>(objectToSave, collectionName));
assertUpdateableIdIfNotSet(objectToSave);
// Create query for entity with the id and old version
@@ -996,7 +997,6 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware {
BasicDBObject dbObject = new BasicDBObject();
maybeEmitEvent(new BeforeConvertEvent<T>(objectToSave, collectionName));
this.mongoConverter.write(objectToSave, dbObject);
maybeEmitEvent(new BeforeSaveEvent<T>(objectToSave, dbObject, collectionName));
@@ -1009,9 +1009,8 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware {
protected <T> void doSave(String collectionName, T objectToSave, MongoWriter<T> writer) {
assertUpdateableIdIfNotSet(objectToSave);
maybeEmitEvent(new BeforeConvertEvent<T>(objectToSave, collectionName));
assertUpdateableIdIfNotSet(objectToSave);
DBObject dbDoc = toDbObject(objectToSave, writer);

View File

@@ -77,6 +77,7 @@ import org.springframework.data.mongodb.core.index.IndexInfo;
import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent;
import org.springframework.data.mongodb.core.mapping.event.BeforeSaveEvent;
import org.springframework.data.mongodb.core.query.BasicQuery;
import org.springframework.data.mongodb.core.query.Criteria;
@@ -113,6 +114,7 @@ import com.mongodb.WriteResult;
* @author Thomas Darimont
* @author Komi Innocent
* @author Christoph Strobl
* @author Laszlo Csontos
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:infrastructure.xml")
@@ -127,13 +129,19 @@ public class MongoTemplateTests {
@Autowired MongoTemplate template;
@Autowired MongoDbFactory factory;
@Autowired ConfigurableApplicationContext context;
ConfigurableApplicationContext context;
MongoTemplate mappingTemplate;
org.springframework.data.util.Version mongoVersion;
@Rule public ExpectedException thrown = ExpectedException.none();
@Autowired
public void setApplicationContext(ConfigurableApplicationContext context) {
context.addApplicationListener(new PersonWithIdPropertyOfTypeUUIDListener());
this.context = context;
}
@Autowired
public void setMongo(Mongo mongo) throws Exception {
@@ -145,7 +153,8 @@ public class MongoTemplateTests {
PersonWith_idPropertyOfTypeString.class, PersonWithIdPropertyOfTypeObjectId.class,
PersonWithIdPropertyOfTypeString.class, PersonWithIdPropertyOfTypeInteger.class,
PersonWithIdPropertyOfTypeBigInteger.class, PersonWithIdPropertyOfPrimitiveInt.class,
PersonWithIdPropertyOfTypeLong.class, PersonWithIdPropertyOfPrimitiveLong.class)));
PersonWithIdPropertyOfTypeLong.class, PersonWithIdPropertyOfPrimitiveLong.class,
PersonWithIdPropertyOfTypeUUID.class)));
mappingContext.setSimpleTypeHolder(conversions.getSimpleTypeHolder());
mappingContext.initialize();
@@ -188,6 +197,7 @@ public class MongoTemplateTests {
template.dropCollection(PersonWithIdPropertyOfPrimitiveInt.class);
template.dropCollection(PersonWithIdPropertyOfTypeLong.class);
template.dropCollection(PersonWithIdPropertyOfPrimitiveLong.class);
template.dropCollection(PersonWithIdPropertyOfTypeUUID.class);
template.dropCollection(PersonWithVersionPropertyOfTypeInteger.class);
template.dropCollection(TestClass.class);
template.dropCollection(Sample.class);
@@ -643,6 +653,23 @@ public class MongoTemplateTests {
assertThat(p12q, notNullValue());
assertThat(p12q.getId(), is(p12.getId()));
checkCollectionContents(PersonWithIdPropertyOfPrimitiveLong.class, 1);
// DATAMONGO-1617
// UUID id - provided
PersonWithIdPropertyOfTypeUUID p13 = new PersonWithIdPropertyOfTypeUUID();
p13.setFirstName("Sven_10");
p13.setAge(22);
p13.setId(UUID.randomUUID());
// insert
mongoTemplate.insert(p13);
// also try save
mongoTemplate.save(p13);
assertThat(p13.getId(), notNullValue());
PersonWithIdPropertyOfTypeUUID p13q = mongoTemplate.findOne(new Query(where("id").in(p13.getId())),
PersonWithIdPropertyOfTypeUUID.class);
assertThat(p13q, notNullValue());
assertThat(p13q.getId(), is(p13.getId()));
checkCollectionContents(PersonWithIdPropertyOfTypeUUID.class, 1);
}
private void checkCollectionContents(Class<?> entityClass, int count) {
@@ -1497,6 +1524,17 @@ public class MongoTemplateTests {
template.insert(dbObject, template.determineCollectionName(PersonWithVersionPropertyOfTypeInteger.class));
}
@Test // DATAMONGO-1617
public void doesNotFailOnInsertForEntityWithNonAutogeneratableId() {
PersonWithIdPropertyOfTypeUUID person = new PersonWithIdPropertyOfTypeUUID();
person.setFirstName("Laszlo");
person.setAge(33);
template.insert(person);
assertThat(person.getId(), is(notNullValue()));
}
/**
* @see DATAMONGO-539
*/
@@ -3590,4 +3628,19 @@ public class MongoTemplateTests {
@Id String id;
Object value;
}
static class PersonWithIdPropertyOfTypeUUIDListener extends AbstractMongoEventListener<PersonWithIdPropertyOfTypeUUID> {
@Override
public void onBeforeConvert(BeforeConvertEvent<PersonWithIdPropertyOfTypeUUID> event) {
PersonWithIdPropertyOfTypeUUID person = event.getSource();
if (person.getId() != null) {
return;
}
person.setId(UUID.randomUUID());
}
}
}

View File

@@ -0,0 +1,57 @@
/*
* Copyright 2010-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.mongodb.core;
import java.util.UUID;
public class PersonWithIdPropertyOfTypeUUID {
private UUID id;
private String firstName;
private int age;
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "PersonWithIdPropertyOfTypeUUID [id=" + id + ", firstName=" + firstName + ", age=" + age + "]";
}
}