diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java index 44ab72c95..32d1670ec 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java @@ -228,11 +228,13 @@ public class MappingMongoConverterParser implements BeanDefinitionParser { String abbreviateFieldNames = element.getAttribute("abbreviate-field-names"); String fieldNamingStrategy = element.getAttribute("field-naming-strategy-ref"); - if (StringUtils.hasText(fieldNamingStrategy) && StringUtils.hasText(abbreviateFieldNames)) { + boolean fieldNamingStrategyReferenced = StringUtils.hasText(fieldNamingStrategy); + boolean abbreviationActivated = StringUtils.hasText(abbreviateFieldNames) + && Boolean.parseBoolean(abbreviateFieldNames); - context - .error("Only one of the attributes abbreviate-field-names and field-naming-strategy-ref can be configured!", - element); + if (fieldNamingStrategyReferenced && abbreviationActivated) { + context.error("Field name abbreviation cannot be activated if a field-naming-strategy-ref is configured!", + element); return; } @@ -240,7 +242,7 @@ public class MappingMongoConverterParser implements BeanDefinitionParser { if ("true".equals(abbreviateFieldNames)) { value = new RootBeanDefinition(CamelCaseAbbreviatingFieldNamingStrategy.class); - } else if (StringUtils.hasText(fieldNamingStrategy)) { + } else if (fieldNamingStrategyReferenced) { value = new RuntimeBeanReference(fieldNamingStrategy); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MappingMongoConverterParserIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MappingMongoConverterParserIntegrationTests.java index f001a0026..7f28694eb 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MappingMongoConverterParserIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MappingMongoConverterParserIntegrationTests.java @@ -116,7 +116,7 @@ public class MappingMongoConverterParserIntegrationTests { public void rejectsInvalidFieldNamingStrategyConfiguration() { exception.expect(BeanDefinitionParsingException.class); - exception.expectMessage("abbreviate-field-names"); + exception.expectMessage("abbreviation"); exception.expectMessage("field-naming-strategy-ref"); BeanDefinitionRegistry factory = new DefaultListableBeanFactory(); @@ -141,18 +141,15 @@ public class MappingMongoConverterParserIntegrationTests { */ @Test public void shouldSupportCustomFieldNamingStrategy() { + assertStrategyReferenceSetFor("mappingConverterWithCustomFieldNamingStrategy"); + } - BeanDefinitionRegistry factory = new DefaultListableBeanFactory(); - XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); - reader.loadBeanDefinitions(new ClassPathResource("namespace/converter-custom-fieldnamingstrategy.xml")); - - BeanDefinition definition = reader.getRegistry().getBeanDefinition( - "mappingConverterWithCustomFieldNamingStrategy.mongoMappingContext"); - - BeanReference value = (BeanReference) definition.getPropertyValues().getPropertyValue("fieldNamingStrategy") - .getValue(); - - assertThat(value.getBeanName(), is("customFieldNamingStrategy")); + /** + * @see DATAMONGO-925, DATAMONGO-928 + */ + @Test + public void shouldNotFailLoadingConfigIfAbbreviationIsDisabledAndStrategySet() { + assertStrategyReferenceSetFor("mappingConverterWithCustomFieldNamingStrategyAndAbbreviationDisabled"); } private void loadValidConfiguration() { @@ -169,6 +166,19 @@ public class MappingMongoConverterParserIntegrationTests { reader.loadBeanDefinitions(new ClassPathResource(configLocation)); } + private static void assertStrategyReferenceSetFor(String beanId) { + + BeanDefinitionRegistry factory = new DefaultListableBeanFactory(); + XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); + reader.loadBeanDefinitions(new ClassPathResource("namespace/converter-custom-fieldnamingstrategy.xml")); + + BeanDefinition definition = reader.getRegistry().getBeanDefinition(beanId.concat(".mongoMappingContext")); + BeanReference value = (BeanReference) definition.getPropertyValues().getPropertyValue("fieldNamingStrategy") + .getValue(); + + assertThat(value.getBeanName(), is("customFieldNamingStrategy")); + } + @Component public static class SampleConverter implements Converter { public DBObject convert(Person source) { diff --git a/spring-data-mongodb/src/test/resources/namespace/converter-custom-fieldnamingstrategy.xml b/spring-data-mongodb/src/test/resources/namespace/converter-custom-fieldnamingstrategy.xml index 35e04bce8..1c3e248ef 100644 --- a/spring-data-mongodb/src/test/resources/namespace/converter-custom-fieldnamingstrategy.xml +++ b/spring-data-mongodb/src/test/resources/namespace/converter-custom-fieldnamingstrategy.xml @@ -7,6 +7,9 @@ + + +