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); } /*