From 3b0c73f109c1cc5ea16aa8cd32031d8d37a39265 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 4 May 2017 23:55:53 +0200 Subject: [PATCH] =?UTF-8?q?DATAREST-1067=20-=20EntityLookup.lookupEntity(?= =?UTF-8?q?=E2=80=A6)=20now=20returns=20Optional.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/rest/core/config/EntityLookupConfiguration.java | 8 ++++++-- .../data/rest/core/support/EntityLookup.java | 2 +- .../core/support/UnwrappingRepositoryInvokerFactory.java | 9 ++++++--- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/config/EntityLookupConfiguration.java b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/config/EntityLookupConfiguration.java index 8ef8e06ee..7653530a2 100644 --- a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/config/EntityLookupConfiguration.java +++ b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/config/EntityLookupConfiguration.java @@ -208,8 +208,12 @@ class EntityLookupConfiguration implements EntityLookupRegistrar { * @see org.springframework.data.rest.core.support.EntityLookup#lookupEntity(java.io.Serializable) */ @Override - public Optional lookupEntity(Object id) { - return Optional.ofNullable(lookupInfo.getLookup().lookup(repository, id)); + @SuppressWarnings("unchecked") + public Optional lookupEntity(Object id) { + + Object result = lookupInfo.getLookup().lookup(repository, id); + + return Optional.class.isInstance(result) ? (Optional) result : Optional.ofNullable((T) result); } /* diff --git a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/support/EntityLookup.java b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/support/EntityLookup.java index 3a2b03282..4be1502d3 100644 --- a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/support/EntityLookup.java +++ b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/support/EntityLookup.java @@ -54,5 +54,5 @@ public interface EntityLookup extends Plugin> { * @param id will never be {@literal null}. * @return can be {@literal null}. */ - Optional lookupEntity(Object id); + Optional lookupEntity(Object id); } diff --git a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/support/UnwrappingRepositoryInvokerFactory.java b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/support/UnwrappingRepositoryInvokerFactory.java index 26b691760..09e38d940 100644 --- a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/support/UnwrappingRepositoryInvokerFactory.java +++ b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/support/UnwrappingRepositoryInvokerFactory.java @@ -22,6 +22,7 @@ import java.io.Serializable; import java.lang.reflect.Method; import java.util.List; import java.util.Optional; +import java.util.function.Supplier; import org.springframework.core.convert.converter.Converter; import org.springframework.data.domain.Pageable; @@ -29,6 +30,7 @@ import org.springframework.data.domain.Sort; import org.springframework.data.repository.support.RepositoryInvoker; import org.springframework.data.repository.support.RepositoryInvokerFactory; import org.springframework.data.rest.core.util.Java8PluginRegistry; +import org.springframework.data.util.Optionals; import org.springframework.util.Assert; import org.springframework.util.MultiValueMap; @@ -89,9 +91,10 @@ public class UnwrappingRepositoryInvokerFactory implements RepositoryInvokerFact @SuppressWarnings("unchecked") public Optional invokeFindById(Object id) { - return (Optional) lookup// - .map(it -> it.lookupEntity(id).orElse(Optional.empty()))// - .orElseGet(() -> delegate.invokeFindById(id)); + Supplier> viaLookup = () -> (Optional) lookup.flatMap(it -> it.lookupEntity(id)); + Supplier> fallback = () -> delegate.invokeFindById(id); + + return Optionals.firstNonEmpty(viaLookup, fallback); } /*