diff --git a/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java b/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java index 094010344..240ebfad8 100644 --- a/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java +++ b/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java @@ -35,7 +35,6 @@ import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Role; -import org.springframework.core.convert.converter.GenericConverter; import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.data.convert.CustomConversions; import org.springframework.data.convert.PropertyValueConverterRegistrar; @@ -67,8 +66,6 @@ import org.springframework.data.mapping.model.PropertyNameFieldNamingStrategy; import org.springframework.transaction.TransactionManager; import org.springframework.transaction.annotation.AnnotationTransactionAttributeSource; -import org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration; -import org.springframework.transaction.config.TransactionManagementConfigUtils; import org.springframework.transaction.interceptor.TransactionAttributeSource; import org.springframework.transaction.interceptor.TransactionInterceptor; import org.springframework.transaction.support.TransactionTemplate; @@ -100,6 +97,7 @@ * @author Subhashni Balakrishnan * @author Jorge Rodriguez Martin * @author Michael Reiche + * @author Vipul Gupta */ @Configuration public abstract class AbstractCouchbaseConfiguration { @@ -280,8 +278,7 @@ public String typeKey() { @Bean public MappingCouchbaseConverter mappingCouchbaseConverter(CouchbaseMappingContext couchbaseMappingContext, CouchbaseCustomConversions couchbaseCustomConversions) { - MappingCouchbaseConverter converter = new MappingCouchbaseConverter(couchbaseMappingContext, typeKey()); - converter.setCustomConversions(couchbaseCustomConversions); + MappingCouchbaseConverter converter = new MappingCouchbaseConverter(couchbaseMappingContext, typeKey(), couchbaseCustomConversions); couchbaseMappingContext.setSimpleTypeHolder(couchbaseCustomConversions.getSimpleTypeHolder()); return converter; } diff --git a/src/main/java/org/springframework/data/couchbase/core/convert/AbstractCouchbaseConverter.java b/src/main/java/org/springframework/data/couchbase/core/convert/AbstractCouchbaseConverter.java index 373272e8e..933ed4b94 100644 --- a/src/main/java/org/springframework/data/couchbase/core/convert/AbstractCouchbaseConverter.java +++ b/src/main/java/org/springframework/data/couchbase/core/convert/AbstractCouchbaseConverter.java @@ -37,6 +37,7 @@ * @author Michael Nitschinger * @author Mark Paluch * @author Michael Reiche + * @author Vipul Gupta */ public abstract class AbstractCouchbaseConverter implements CouchbaseConverter, InitializingBean { @@ -53,15 +54,17 @@ public abstract class AbstractCouchbaseConverter implements CouchbaseConverter, /** * Holds the custom conversions. */ - protected CustomConversions conversions = new CouchbaseCustomConversions(Collections.emptyList()); + protected CustomConversions conversions; /** - * Create a new converter and hand it over the {@link ConversionService} + * Create a new converter with custom conversions and hand it over the {@link ConversionService} * * @param conversionService the conversion service to use. + * @param customConversions the custom conversions to use */ - protected AbstractCouchbaseConverter(final GenericConversionService conversionService) { + protected AbstractCouchbaseConverter(final GenericConversionService conversionService, final CustomConversions customConversions) { this.conversionService = conversionService; + this.conversions = customConversions; } /** diff --git a/src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java b/src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java index a3c5b1ee9..99df2a0cd 100644 --- a/src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java +++ b/src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java @@ -90,6 +90,7 @@ * @author Mark Paluch * @author Michael Reiche * @author Remi Bleuse + * @author Vipul Gupta */ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implements ApplicationContextAware { @@ -140,22 +141,32 @@ public MappingCouchbaseConverter( this(mappingContext, null); } + /** + * Create a new {@link MappingCouchbaseConverter} + * + * @param mappingContext the mapping context to use. + * @param typeKey the attribute name to use to store complex types class name. + */ + public MappingCouchbaseConverter( + final MappingContext, CouchbasePersistentProperty> mappingContext, + final String typeKey) { + this(mappingContext, typeKey, new CouchbaseCustomConversions(Collections.emptyList())); + } + /** * Create a new {@link MappingCouchbaseConverter} that will store class name for complex types in the typeKey * attribute. * * @param mappingContext the mapping context to use. * @param typeKey the attribute name to use to store complex types class name. + * @param customConversions the custom conversions to use */ public MappingCouchbaseConverter( final MappingContext, CouchbasePersistentProperty> mappingContext, - final String typeKey) { - super(new DefaultConversionService()); + final String typeKey, + final CustomConversions customConversions) { + super(new DefaultConversionService(), customConversions); this.mappingContext = mappingContext; - // this is how the MappingCouchbaseConverter gets the custom conversions. - // the conversions Service gets them in afterPropertiesSet() - CustomConversions customConversions = new CouchbaseCustomConversions(Collections.emptyList()); - this.setCustomConversions(customConversions); // Don't rely on setSimpleTypeHolder being called in afterPropertiesSet() - some integration tests do not use it // if the mappingContext does not have the SimpleTypes, it will not know that they have converters, then it will // try to access the fields of the type and (maybe) fail with InaccessibleObjectException diff --git a/src/test/java/org/springframework/data/couchbase/domain/AbstractingMappingCouchbaseConverter.java b/src/test/java/org/springframework/data/couchbase/domain/AbstractingMappingCouchbaseConverter.java index fd29e6b37..064490d7c 100644 --- a/src/test/java/org/springframework/data/couchbase/domain/AbstractingMappingCouchbaseConverter.java +++ b/src/test/java/org/springframework/data/couchbase/domain/AbstractingMappingCouchbaseConverter.java @@ -15,6 +15,7 @@ */ package org.springframework.data.couchbase.domain; +import org.springframework.data.couchbase.core.convert.CouchbaseCustomConversions; import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter; import org.springframework.data.couchbase.core.mapping.CouchbasePersistentEntity; import org.springframework.data.couchbase.core.mapping.CouchbasePersistentProperty; @@ -37,8 +38,9 @@ public class AbstractingMappingCouchbaseConverter extends MappingCouchbaseConver */ public AbstractingMappingCouchbaseConverter( final MappingContext, CouchbasePersistentProperty> mappingContext, - final String typeKey) { - super(mappingContext, typeKey); + final String typeKey, + final CouchbaseCustomConversions couchbaseCustomConversions) { + super(mappingContext, typeKey, couchbaseCustomConversions); this.typeMapper = new AbstractingTypeMapper(typeKey); } diff --git a/src/test/java/org/springframework/data/couchbase/domain/Config.java b/src/test/java/org/springframework/data/couchbase/domain/Config.java index c57a96ea3..3b942c872 100644 --- a/src/test/java/org/springframework/data/couchbase/domain/Config.java +++ b/src/test/java/org/springframework/data/couchbase/domain/Config.java @@ -211,8 +211,7 @@ public MappingCouchbaseConverter mappingCouchbaseConverter(CouchbaseMappingConte // that has an getAliasFor(info) that just returns getType().getName(). // Our CustomMappingCouchbaseConverter uses a TypeBasedCouchbaseTypeMapper that will // use the DocumentType annotation - MappingCouchbaseConverter converter = new CustomMappingCouchbaseConverter(couchbaseMappingContext, typeKey()); - converter.setCustomConversions(couchbaseCustomConversions); + MappingCouchbaseConverter converter = new CustomMappingCouchbaseConverter(couchbaseMappingContext, typeKey(), couchbaseCustomConversions); return converter; } diff --git a/src/test/java/org/springframework/data/couchbase/domain/CustomMappingCouchbaseConverter.java b/src/test/java/org/springframework/data/couchbase/domain/CustomMappingCouchbaseConverter.java index b8cfd6797..44e0bbb3d 100644 --- a/src/test/java/org/springframework/data/couchbase/domain/CustomMappingCouchbaseConverter.java +++ b/src/test/java/org/springframework/data/couchbase/domain/CustomMappingCouchbaseConverter.java @@ -15,6 +15,7 @@ */ package org.springframework.data.couchbase.domain; +import org.springframework.data.couchbase.core.convert.CouchbaseCustomConversions; import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter; import org.springframework.data.couchbase.core.mapping.CouchbasePersistentEntity; import org.springframework.data.couchbase.core.mapping.CouchbasePersistentProperty; @@ -37,4 +38,21 @@ public CustomMappingCouchbaseConverter( this.typeMapper = new TypeBasedCouchbaseTypeMapper(typeKey); } + /** + * this constructer creates a TypeBasedCouchbaseTypeMapper with the specified couchbaseCustomConversions and typeKey + * while MappingCouchbaseConverter uses a DefaultCouchbaseTypeMapper typeMapper = new DefaultCouchbaseTypeMapper(typeKey != null ? typeKey : + * TYPEKEY_DEFAULT); + * + * @param mappingContext + * @param typeKey - the typeKey to be used (normally "_class") + * @param couchbaseCustomConversions - custom conversions to use + */ + public CustomMappingCouchbaseConverter( + final MappingContext, CouchbasePersistentProperty> mappingContext, + final String typeKey, + final CouchbaseCustomConversions couchbaseCustomConversions) { + super(mappingContext, typeKey, couchbaseCustomConversions); + this.typeMapper = new TypeBasedCouchbaseTypeMapper(typeKey); + } + } diff --git a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseAbstractRepositoryIntegrationTests.java b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseAbstractRepositoryIntegrationTests.java index 4f7464512..12b655c5c 100644 --- a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseAbstractRepositoryIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseAbstractRepositoryIntegrationTests.java @@ -124,8 +124,8 @@ public MappingCouchbaseConverter mappingCouchbaseConverter(CouchbaseMappingConte // Our CustomMappingCouchbaseConverter uses a TypeBasedCouchbaseTypeMapper that will // use the DocumentType annotation MappingCouchbaseConverter converter = new AbstractingMappingCouchbaseConverter(couchbaseMappingContext, - typeKey()); - converter.setCustomConversions(couchbaseCustomConversions); + typeKey(), + couchbaseCustomConversions); return converter; }