DATADOC-69 - Repository namespace now allows referenceing a MappingContext and picks up the default one if available.
This commit is contained in:
@@ -44,14 +44,15 @@ import org.w3c.dom.Element;
|
|||||||
*/
|
*/
|
||||||
public class MongoMappingConverterParser extends AbstractBeanDefinitionParser {
|
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 MAPPING_CONFIGURATION_HELPER = "mappingConfigurationHelper";
|
||||||
private static final String TEMPLATE = "mongoTemplate";
|
private static final String TEMPLATE = "mongoTemplate";
|
||||||
private static final String BASE_PACKAGE = "base-package";
|
private static final String BASE_PACKAGE = "base-package";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) throws BeanDefinitionStoreException {
|
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
|
@Override
|
||||||
|
|||||||
@@ -15,8 +15,11 @@
|
|||||||
*/
|
*/
|
||||||
package org.springframework.data.document.mongodb.config;
|
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.BeanDefinitionBuilder;
|
||||||
|
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
||||||
import org.springframework.data.document.mongodb.config.SimpleMongoRepositoryConfiguration.MongoRepositoryConfiguration;
|
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.springframework.data.repository.config.AbstractRepositoryConfigDefinitionParser;
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
@@ -30,7 +33,9 @@ import org.w3c.dom.Element;
|
|||||||
public class MongoRepositoryConfigDefinitionParser
|
public class MongoRepositoryConfigDefinitionParser
|
||||||
extends
|
extends
|
||||||
AbstractRepositoryConfigDefinitionParser<SimpleMongoRepositoryConfiguration, MongoRepositoryConfiguration> {
|
AbstractRepositoryConfigDefinitionParser<SimpleMongoRepositoryConfiguration, MongoRepositoryConfiguration> {
|
||||||
|
|
||||||
|
private static final String MAPPING_CONTEXT_DEFAULT = MongoMappingConverterParser.MAPPING_CONTEXT;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
*
|
*
|
||||||
@@ -47,20 +52,44 @@ public class MongoRepositoryConfigDefinitionParser
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (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)
|
||||||
* @see org.springframework.data.repository.config.
|
*/
|
||||||
* AbstractRepositoryConfigDefinitionParser
|
|
||||||
* #postProcessBeanDefinition(org.springframework
|
|
||||||
* .data.repository.config.SingleRepositoryConfigInformation,
|
|
||||||
* org.springframework.beans.factory.support.BeanDefinitionBuilder,
|
|
||||||
* java.lang.Object)
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
protected void postProcessBeanDefinition(
|
protected void postProcessBeanDefinition(
|
||||||
MongoRepositoryConfiguration context,
|
MongoRepositoryConfiguration context,
|
||||||
BeanDefinitionBuilder builder, Object beanSource) {
|
BeanDefinitionBuilder builder, BeanDefinitionRegistry registry, Object beanSource) {
|
||||||
|
|
||||||
builder.addPropertyReference("template", context.getMongoTemplateRef());
|
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 MONGO_TEMPLATE_REF = "mongo-template-ref";
|
||||||
private static final String DEFAULT_MONGO_TEMPLATE_REF = "mongoTemplate";
|
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
|
return StringUtils.hasText(templateRef) ? templateRef
|
||||||
: DEFAULT_MONGO_TEMPLATE_REF;
|
: 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> {
|
SingleRepositoryConfigInformation<SimpleMongoRepositoryConfiguration> {
|
||||||
|
|
||||||
String getMongoTemplateRef();
|
String getMongoTemplateRef();
|
||||||
|
|
||||||
|
String getMappingContextRef();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -150,6 +160,13 @@ public class SimpleMongoRepositoryConfiguration extends RepositoryConfig<SimpleM
|
|||||||
|
|
||||||
return getAttribute(MONGO_TEMPLATE_REF);
|
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();
|
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:documentation>
|
||||||
</xsd:annotation>
|
</xsd:annotation>
|
||||||
</xsd:attribute>
|
</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:attributeGroup ref="repository:repository-attributes"/>
|
||||||
</xsd:extension>
|
</xsd:extension>
|
||||||
</xsd:complexContent>
|
</xsd:complexContent>
|
||||||
|
|||||||
@@ -1,5 +1,12 @@
|
|||||||
package org.springframework.data.document.mongodb.repository.config;
|
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.data.document.mongodb.repository.AbstractPersonRepositoryIntegrationTests;
|
||||||
import org.springframework.test.context.ContextConfiguration;
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
|
|
||||||
@@ -14,4 +21,13 @@ import org.springframework.test.context.ContextConfiguration;
|
|||||||
public class MongoNamespaceIntegrationTests extends
|
public class MongoNamespaceIntegrationTests extends
|
||||||
AbstractPersonRepositoryIntegrationTests {
|
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"/>
|
<constructor-arg ref="mappingConverter"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean class="org.springframework.data.document.mongodb.MongoExceptionTranslator"/>
|
|
||||||
|
|
||||||
</beans>
|
</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
|
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/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">
|
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">
|
<mongo:repositories base-package="org.springframework.data.**.repository">
|
||||||
<repository:exclude-filter type="regex" expression=".*MongoRepository"/>
|
<repository:exclude-filter type="regex" expression=".*MongoRepository"/>
|
||||||
|
|||||||
Reference in New Issue
Block a user