DATADOC-69 - Repository namespace now allows referenceing a MappingContext and picks up the default one if available.
This commit is contained in:
@@ -39,14 +39,15 @@ import org.w3c.dom.Element;
|
||||
*/
|
||||
public class MongoMappingConverterParser extends AbstractBeanDefinitionParser {
|
||||
|
||||
private static final String MAPPING_CONTEXT = "mappingContext";
|
||||
static final String MAPPING_CONTEXT = "mappingContext";
|
||||
private static final String MAPPING_CONFIGURATION_HELPER = "mappingConfigurationHelper";
|
||||
private static final String TEMPLATE = "mongoTemplate";
|
||||
private static final String BASE_PACKAGE = "base-package";
|
||||
|
||||
@Override
|
||||
protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) throws BeanDefinitionStoreException {
|
||||
return "mappingConverter";
|
||||
String id = super.resolveId(element, definition, parserContext);
|
||||
return StringUtils.hasText(id) ? id : "mappingConverter";
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -15,8 +15,11 @@
|
||||
*/
|
||||
package org.springframework.data.document.mongodb.config;
|
||||
|
||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
||||
import org.springframework.data.document.mongodb.config.SimpleMongoRepositoryConfiguration.MongoRepositoryConfiguration;
|
||||
import org.springframework.data.mapping.model.MappingContext;
|
||||
import org.springframework.data.repository.config.AbstractRepositoryConfigDefinitionParser;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
@@ -30,7 +33,9 @@ import org.w3c.dom.Element;
|
||||
public class MongoRepositoryConfigDefinitionParser
|
||||
extends
|
||||
AbstractRepositoryConfigDefinitionParser<SimpleMongoRepositoryConfiguration, MongoRepositoryConfiguration> {
|
||||
|
||||
|
||||
private static final String MAPPING_CONTEXT_DEFAULT = MongoMappingConverterParser.MAPPING_CONTEXT;
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
@@ -47,20 +52,44 @@ public class MongoRepositoryConfigDefinitionParser
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.springframework.data.repository.config.
|
||||
* AbstractRepositoryConfigDefinitionParser
|
||||
* #postProcessBeanDefinition(org.springframework
|
||||
* .data.repository.config.SingleRepositoryConfigInformation,
|
||||
* org.springframework.beans.factory.support.BeanDefinitionBuilder,
|
||||
* java.lang.Object)
|
||||
*/
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.data.repository.config.AbstractRepositoryConfigDefinitionParser#postProcessBeanDefinition(org.springframework.data.repository.config.SingleRepositoryConfigInformation, org.springframework.beans.factory.support.BeanDefinitionBuilder, org.springframework.beans.factory.support.BeanDefinitionRegistry, java.lang.Object)
|
||||
*/
|
||||
@Override
|
||||
protected void postProcessBeanDefinition(
|
||||
MongoRepositoryConfiguration context,
|
||||
BeanDefinitionBuilder builder, Object beanSource) {
|
||||
BeanDefinitionBuilder builder, BeanDefinitionRegistry registry, Object beanSource) {
|
||||
|
||||
builder.addPropertyReference("template", context.getMongoTemplateRef());
|
||||
|
||||
String mappingContextRef = getMappingContextReference(context, registry);
|
||||
if (mappingContextRef != null) {
|
||||
builder.addPropertyReference("mappingContext", mappingContextRef);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the bean name of a {@link MappingContext} to be wired. Will inspect the namespace attribute first and if no
|
||||
* config is found in that place it will try to lookup the default one. Will return {@literal null} if neither one is
|
||||
* available.
|
||||
*
|
||||
* @param config
|
||||
* @param registry
|
||||
* @return
|
||||
*/
|
||||
private String getMappingContextReference(MongoRepositoryConfiguration config, BeanDefinitionRegistry registry) {
|
||||
|
||||
String contextRef = config.getMappingContextRef();
|
||||
|
||||
if (contextRef != null) {
|
||||
return contextRef;
|
||||
}
|
||||
|
||||
try {
|
||||
registry.getBeanDefinition(MAPPING_CONTEXT_DEFAULT);
|
||||
return MAPPING_CONTEXT_DEFAULT;
|
||||
} catch(NoSuchBeanDefinitionException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,6 +36,8 @@ public class SimpleMongoRepositoryConfiguration extends RepositoryConfig<SimpleM
|
||||
|
||||
private static final String MONGO_TEMPLATE_REF = "mongo-template-ref";
|
||||
private static final String DEFAULT_MONGO_TEMPLATE_REF = "mongoTemplate";
|
||||
|
||||
private static final String MAPPING_CONTEXT_REF = "mongo-mapping-context-ref";
|
||||
|
||||
|
||||
/**
|
||||
@@ -61,6 +63,12 @@ public class SimpleMongoRepositoryConfiguration extends RepositoryConfig<SimpleM
|
||||
return StringUtils.hasText(templateRef) ? templateRef
|
||||
: DEFAULT_MONGO_TEMPLATE_REF;
|
||||
}
|
||||
|
||||
public String getMappingContextRef() {
|
||||
|
||||
String attribute = getSource().getAttribute(MAPPING_CONTEXT_REF);
|
||||
return StringUtils.hasText(attribute) ? attribute : null;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@@ -113,6 +121,8 @@ public class SimpleMongoRepositoryConfiguration extends RepositoryConfig<SimpleM
|
||||
SingleRepositoryConfigInformation<SimpleMongoRepositoryConfiguration> {
|
||||
|
||||
String getMongoTemplateRef();
|
||||
|
||||
String getMappingContextRef();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -150,6 +160,13 @@ public class SimpleMongoRepositoryConfiguration extends RepositoryConfig<SimpleM
|
||||
|
||||
return getAttribute(MONGO_TEMPLATE_REF);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.springframework.data.document.mongodb.config.SimpleMongoRepositoryConfiguration.MongoRepositoryConfiguration#getMappingContextRef()
|
||||
*/
|
||||
public String getMappingContextRef() {
|
||||
return getAttribute(MAPPING_CONTEXT_REF);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -188,5 +205,12 @@ public class SimpleMongoRepositoryConfiguration extends RepositoryConfig<SimpleM
|
||||
|
||||
return getParent().getMongoTemplateRef();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.springframework.data.document.mongodb.config.SimpleMongoRepositoryConfiguration.MongoRepositoryConfiguration#getMappingContextRef()
|
||||
*/
|
||||
public String getMappingContextRef() {
|
||||
return getParent().getMappingContextRef();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,6 +74,13 @@ The host to connect to a MongoDB server. Default is localhost
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:attribute>
|
||||
<xsd:attribute name="mongo-mapping-context-ref" type="mappingContextRef" default="mappingContext">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
The reference to a MappingContext. Will pick up a bean named 'mappingContext' by default if available.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:attribute>
|
||||
<xsd:attributeGroup ref="repository:repository-attributes"/>
|
||||
</xsd:extension>
|
||||
</xsd:complexContent>
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
package org.springframework.data.document.mongodb.repository.config;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.beans.factory.xml.XmlBeanFactory;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.data.document.mongodb.repository.AbstractPersonRepositoryIntegrationTests;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
|
||||
@@ -14,4 +21,13 @@ import org.springframework.test.context.ContextConfiguration;
|
||||
public class MongoNamespaceIntegrationTests extends
|
||||
AbstractPersonRepositoryIntegrationTests {
|
||||
|
||||
|
||||
@Test
|
||||
public void assertDefaultMappingContextIsWired() {
|
||||
|
||||
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("MongoNamespaceIntegrationTests-context.xml", getClass()));
|
||||
BeanDefinition definition = factory.getBeanDefinition("personRepository");
|
||||
assertThat(definition, is(notNullValue()));
|
||||
assertThat(definition.getPropertyValues().getPropertyValue("mappingContext"), is(notNullValue()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,4 @@
|
||||
<constructor-arg ref="mappingConverter"/>
|
||||
</bean>
|
||||
|
||||
<bean class="org.springframework.data.document.mongodb.MongoExceptionTranslator"/>
|
||||
|
||||
</beans>
|
||||
|
||||
@@ -6,8 +6,17 @@
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
|
||||
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
|
||||
http://www.springframework.org/schema/data/repository http://www.springframework.org/schema/data/repository/spring-repository-1.0.xsd">
|
||||
|
||||
<import resource="classpath:infrastructure.xml"/>
|
||||
|
||||
<mongo:mongo id="mongo" />
|
||||
|
||||
<bean id="mongoTemplate" class="org.springframework.data.document.mongodb.MongoTemplate">
|
||||
<constructor-arg ref="mongo" />
|
||||
<constructor-arg value="database" />
|
||||
<constructor-arg value="collection" />
|
||||
<constructor-arg>
|
||||
<mongo:mapping-converter />
|
||||
</constructor-arg>
|
||||
</bean>
|
||||
|
||||
<mongo:repositories base-package="org.springframework.data.**.repository">
|
||||
<repository:exclude-filter type="regex" expression=".*MongoRepository"/>
|
||||
|
||||
Reference in New Issue
Block a user