diff --git a/src/main/java/org/springframework/data/couchbase/core/CouchbaseTemplate.java b/src/main/java/org/springframework/data/couchbase/core/CouchbaseTemplate.java index 771b9871..0353fa6c 100644 --- a/src/main/java/org/springframework/data/couchbase/core/CouchbaseTemplate.java +++ b/src/main/java/org/springframework/data/couchbase/core/CouchbaseTemplate.java @@ -578,7 +578,7 @@ public class CouchbaseTemplate implements CouchbaseOperations, ApplicationEventP final PersistType persistType) { ensureNotIterable(objectToPersist); - final ConvertingPropertyAccessor accessor = getPropertyAccessor(objectToPersist); + final ConvertingPropertyAccessor accessor = getPropertyAccessor(objectToPersist); final CouchbasePersistentEntity persistentEntity = mappingContext.getRequiredPersistentEntity(objectToPersist.getClass()); final CouchbasePersistentProperty versionProperty = persistentEntity.getVersionProperty(); final Long version = versionProperty != null ? accessor.getProperty(versionProperty, Long.class) : null; @@ -692,28 +692,30 @@ public class CouchbaseTemplate implements CouchbaseOperations, ApplicationEventP } private T mapToEntity(String id, Document data, Class entityClass) { + if (data == null) { return null; } final CouchbaseDocument converted = new CouchbaseDocument(id); - Object readEntity = converter.read(entityClass, (CouchbaseDocument) decodeAndUnwrap(data, converted)); + T readEntity = converter.read(entityClass, (CouchbaseDocument) decodeAndUnwrap(data, converted)); - final ConvertingPropertyAccessor accessor = getPropertyAccessor(readEntity); + final ConvertingPropertyAccessor accessor = getPropertyAccessor(readEntity); CouchbasePersistentEntity persistentEntity = mappingContext.getRequiredPersistentEntity(readEntity.getClass()); if (persistentEntity.getVersionProperty() != null) { accessor.setProperty(persistentEntity.getVersionProperty(), data.cas()); - } + } - return (T) readEntity; + return accessor.getBean(); } - private final ConvertingPropertyAccessor getPropertyAccessor(Object source) { - CouchbasePersistentEntity entity = mappingContext.getRequiredPersistentEntity(source.getClass()); - PersistentPropertyAccessor accessor = entity.getPropertyAccessor(source); + private final ConvertingPropertyAccessor getPropertyAccessor(T source) { - return new ConvertingPropertyAccessor(accessor, converter.getConversionService()); + CouchbasePersistentEntity entity = mappingContext.getRequiredPersistentEntity(source.getClass()); + PersistentPropertyAccessor accessor = entity.getPropertyAccessor(source); + + return new ConvertingPropertyAccessor<>(accessor, converter.getConversionService()); } private void checkN1ql() { diff --git a/src/main/java/org/springframework/data/couchbase/core/RxJavaCouchbaseTemplate.java b/src/main/java/org/springframework/data/couchbase/core/RxJavaCouchbaseTemplate.java index 618d85de..59b6c5b9 100644 --- a/src/main/java/org/springframework/data/couchbase/core/RxJavaCouchbaseTemplate.java +++ b/src/main/java/org/springframework/data/couchbase/core/RxJavaCouchbaseTemplate.java @@ -194,11 +194,12 @@ public class RxJavaCouchbaseTemplate implements RxJavaCouchbaseOperations { return c; } - private final ConvertingPropertyAccessor getPropertyAccessor(Object source) { - CouchbasePersistentEntity entity = mappingContext.getRequiredPersistentEntity(source.getClass()); - PersistentPropertyAccessor accessor = entity.getPropertyAccessor(source); + private final ConvertingPropertyAccessor getPropertyAccessor(T source) { - return new ConvertingPropertyAccessor(accessor, converter.getConversionService()); + CouchbasePersistentEntity entity = mappingContext.getRequiredPersistentEntity(source.getClass()); + PersistentPropertyAccessor accessor = entity.getPropertyAccessor(source); + + return new ConvertingPropertyAccessor<>(accessor, converter.getConversionService()); } private Observable doPersist(T objectToPersist, PersistType persistType, PersistTo persistTo, ReplicateTo replicateTo) { @@ -227,12 +228,9 @@ public class RxJavaCouchbaseTemplate implements RxJavaCouchbaseOperations { break; } return persistFunction.call(toJsonDocument(objectToPersist), persistTo, replicateTo) - .flatMap(storedDoc -> { - if (storedDoc != null && storedDoc.cas() != 0) { - setVersion(objectToPersist, storedDoc.cas()); - } - return Observable.just(objectToPersist); - }) + .flatMap(storedDoc -> Observable.just(storedDoc != null && storedDoc.cas() != 0 + ? setVersion(objectToPersist, storedDoc.cas()) + : objectToPersist)) .onErrorResumeNext(e -> { if (e instanceof DocumentAlreadyExistsException) { throw new OptimisticLockingFailureException(persistType.springDataOperationName + @@ -259,22 +257,25 @@ public class RxJavaCouchbaseTemplate implements RxJavaCouchbaseOperations { } private Long getVersion(T object) { - final ConvertingPropertyAccessor accessor = getPropertyAccessor(object); + CouchbasePersistentProperty versionProperty = versionProperty(object); - if (versionProperty != null) { - return accessor.getProperty(versionProperty, Long.class); - } - return null; + return versionProperty == null // + ? null // + : getPropertyAccessor(object).getProperty(versionProperty, Long.class); } - private void setVersion(T object, long cas) { - final ConvertingPropertyAccessor accessor = getPropertyAccessor(object); + private T setVersion(T object, long version) { + CouchbasePersistentProperty versionProperty = versionProperty(object); - if (versionProperty != null) { - accessor.setProperty(versionProperty, cas); + if (versionProperty == null) { + return object; } + + final ConvertingPropertyAccessor accessor = getPropertyAccessor(object); + accessor.setProperty(versionProperty, version); + return accessor.getBean(); } private Observable doRemove(T objectToRemove, final PersistTo persistTo, final ReplicateTo replicateTo) { 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 102a050c..2c1fb1c8 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 @@ -464,7 +464,7 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter throw new MappingException("No mapping metadata found for entity of type " + source.getClass().getName()); } - final ConvertingPropertyAccessor accessor = getPropertyAccessor(source); + final ConvertingPropertyAccessor accessor = getPropertyAccessor(source); final CouchbasePersistentProperty idProperty = entity.getIdProperty(); final CouchbasePersistentProperty versionProperty = entity.getVersionProperty(); @@ -811,11 +811,12 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter } } - private ConvertingPropertyAccessor getPropertyAccessor(Object source) { + private ConvertingPropertyAccessor getPropertyAccessor(Object source) { + CouchbasePersistentEntity entity = mappingContext.getRequiredPersistentEntity(source.getClass()); - PersistentPropertyAccessor accessor = entity.getPropertyAccessor(source); + PersistentPropertyAccessor accessor = entity.getPropertyAccessor(source); - return new ConvertingPropertyAccessor(accessor, conversionService); + return new ConvertingPropertyAccessor<>(accessor, conversionService); } /**