Put addPersistentEntity calls into a dedicated ApplicationEvent listener bean that gets populated by the classpath scanning done in the namespace parser.
This commit is contained in:
@@ -35,8 +35,8 @@ import org.springframework.data.document.mongodb.convert.MappingMongoConverter;
|
||||
import org.springframework.data.document.mongodb.mapping.Document;
|
||||
import org.springframework.data.document.mongodb.mapping.MongoMappingConfigurationBuilder;
|
||||
import org.springframework.data.document.mongodb.mapping.MongoMappingContext;
|
||||
import org.springframework.data.document.mongodb.mapping.event.MappingConfigurationListener;
|
||||
import org.springframework.data.document.mongodb.mapping.index.IndexCreationHelper;
|
||||
import org.springframework.data.mapping.model.MappingException;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
/**
|
||||
@@ -51,6 +51,7 @@ public class MongoMappingConverterParser extends AbstractBeanDefinitionParser {
|
||||
private static final String CONFIGURATION_BUILDER = "mappingConfigurationBuilder";
|
||||
private static final String MAPPING_CONTEXT = "mappingContext";
|
||||
private static final String INDEX_CREATION_HELPER = "indexCreationHelper";
|
||||
private static final String CONFIGURATION_LISTENER = "mappingConfigurationListener";
|
||||
private static final String TEMPLATE = "mongoTemplate";
|
||||
private static final String BASE_PACKAGE = "base-package";
|
||||
|
||||
@@ -74,7 +75,7 @@ public class MongoMappingConverterParser extends AbstractBeanDefinitionParser {
|
||||
if (null == ctxRef || "".equals(ctxRef)) {
|
||||
BeanDefinitionBuilder mappingContextBuilder = BeanDefinitionBuilder.genericBeanDefinition(MongoMappingContext.class);
|
||||
mappingContextBuilder.addPropertyReference("mappingConfigurationBuilder", builderRef);
|
||||
//mappingContextBuilder.addPropertyValue("indexCreationHelper", new RuntimeBeanReference(INDEX_CREATION_HELPER));
|
||||
mappingContextBuilder.addPropertyValue("indexCreationHelper", new RuntimeBeanReference(INDEX_CREATION_HELPER));
|
||||
registry.registerBeanDefinition(MAPPING_CONTEXT, mappingContextBuilder.getBeanDefinition());
|
||||
ctxRef = MAPPING_CONTEXT;
|
||||
}
|
||||
@@ -94,7 +95,6 @@ public class MongoMappingConverterParser extends AbstractBeanDefinitionParser {
|
||||
}
|
||||
converterBuilder.addPropertyReference("mongo", mongoRef);
|
||||
|
||||
/*
|
||||
try {
|
||||
registry.getBeanDefinition(INDEX_CREATION_HELPER);
|
||||
} catch (NoSuchBeanDefinitionException ignored) {
|
||||
@@ -106,7 +106,9 @@ public class MongoMappingConverterParser extends AbstractBeanDefinitionParser {
|
||||
indexListenerBuilder.addPropertyValue("mongoTemplate", new RuntimeBeanReference(templateRef));
|
||||
registry.registerBeanDefinition(INDEX_CREATION_HELPER, indexListenerBuilder.getBeanDefinition());
|
||||
}
|
||||
*/
|
||||
|
||||
BeanDefinitionBuilder listenerBuilder = BeanDefinitionBuilder.genericBeanDefinition(MappingConfigurationListener.class);
|
||||
listenerBuilder.addPropertyReference("mappingContext", ctxRef);
|
||||
|
||||
// Scan for @Document entities
|
||||
String basePackage = element.getAttribute(BASE_PACKAGE);
|
||||
@@ -116,18 +118,14 @@ public class MongoMappingConverterParser extends AbstractBeanDefinitionParser {
|
||||
scanner.addIncludeFilter(new AnnotationTypeFilter(Persistent.class));
|
||||
Set<BeanDefinition> entities = scanner.findCandidateComponents(basePackage);
|
||||
if (null != entities) {
|
||||
Set<Class<?>> initialEntitySet = new HashSet<Class<?>>(entities.size());
|
||||
Set<String> initialEntitySet = new HashSet<String>(entities.size());
|
||||
for (BeanDefinition def : entities) {
|
||||
String clazzName = def.getBeanClassName();
|
||||
try {
|
||||
initialEntitySet.add(Class.forName(clazzName));
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new MappingException(e.getMessage(), e);
|
||||
}
|
||||
initialEntitySet.add(def.getBeanClassName());
|
||||
}
|
||||
converterBuilder.addPropertyValue("initialEntitySet", initialEntitySet);
|
||||
listenerBuilder.addPropertyValue("initialEntitySet", initialEntitySet);
|
||||
}
|
||||
}
|
||||
registry.registerBeanDefinition(CONFIGURATION_LISTENER, listenerBuilder.getBeanDefinition());
|
||||
|
||||
return converterBuilder.getBeanDefinition();
|
||||
}
|
||||
|
||||
@@ -24,11 +24,9 @@ import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import com.mongodb.BasicDBList;
|
||||
import com.mongodb.BasicDBObject;
|
||||
@@ -86,7 +84,6 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext
|
||||
protected boolean useFieldAccessOnly = true;
|
||||
protected Mongo mongo;
|
||||
protected String defaultDatabase;
|
||||
protected Set<Class<?>> initialEntitySet = new HashSet<Class<?>>();
|
||||
|
||||
public MappingMongoConverter() {
|
||||
initializeConverters();
|
||||
@@ -127,11 +124,6 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext
|
||||
|
||||
public void setMappingContext(MappingContext mappingContext) {
|
||||
this.mappingContext = mappingContext;
|
||||
if (initialEntitySet.size() > 0 && null == mappingContext.getPersistentEntity(initialEntitySet.iterator().next())) {
|
||||
for (Class<?> entity : initialEntitySet) {
|
||||
mappingContext.addPersistentEntity(entity);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Mongo getMongo() {
|
||||
@@ -166,14 +158,6 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext
|
||||
this.useFieldAccessOnly = useFieldAccessOnly;
|
||||
}
|
||||
|
||||
public Set<Class<?>> getInitialEntitySet() {
|
||||
return initialEntitySet;
|
||||
}
|
||||
|
||||
public void setInitialEntitySet(Set<Class<?>> initialEntitySet) {
|
||||
this.initialEntitySet = initialEntitySet;
|
||||
}
|
||||
|
||||
public <T> T convertObjectId(ObjectId id, Class<T> targetType) {
|
||||
return conversionService.convert(id, targetType);
|
||||
}
|
||||
@@ -618,9 +602,6 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext
|
||||
}
|
||||
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
for (Class<?> entity : initialEntitySet) {
|
||||
mappingContext.addPersistentEntity(entity);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright (c) 2011 by the original author(s).
|
||||
*
|
||||
* 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.document.mongodb.mapping.event;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.context.ApplicationListener;
|
||||
import org.springframework.context.event.ContextRefreshedEvent;
|
||||
import org.springframework.data.document.mongodb.mapping.MongoMappingContext;
|
||||
|
||||
/**
|
||||
* @author Jon Brisbin <jbrisbin@vmware.com>
|
||||
*/
|
||||
public class MappingConfigurationListener implements ApplicationListener<ContextRefreshedEvent> {
|
||||
|
||||
private MongoMappingContext mappingContext;
|
||||
private Set<String> initialEntitySet;
|
||||
|
||||
public MappingConfigurationListener() {
|
||||
}
|
||||
|
||||
public MongoMappingContext getMappingContext() {
|
||||
return mappingContext;
|
||||
}
|
||||
|
||||
public void setMappingContext(MongoMappingContext mappingContext) {
|
||||
this.mappingContext = mappingContext;
|
||||
}
|
||||
|
||||
public Set<String> getInitialEntitySet() {
|
||||
return initialEntitySet;
|
||||
}
|
||||
|
||||
public void setInitialEntitySet(Set<String> initialEntitySet) {
|
||||
this.initialEntitySet = initialEntitySet;
|
||||
}
|
||||
|
||||
public void onApplicationEvent(ContextRefreshedEvent event) {
|
||||
for (String className : initialEntitySet) {
|
||||
try {
|
||||
Class<?> clazz = Class.forName(className);
|
||||
if (null == mappingContext.getPersistentEntity(clazz)) {
|
||||
mappingContext.addPersistentEntity(clazz);
|
||||
}
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user