From b9c02938d1756da30ea0caa5880b143522741b84 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Thu, 14 Jan 2021 15:37:37 +0100 Subject: [PATCH] Let DelegatingHandlerMapping implement HandlerMapping directly. We actually do not want to inherit all the functionality implemented in AbstractHandlerMapping. The sole reason we did so before was to override the method to propagate the PathPatternResolver to the downstream HandlerMappings. We now just declare the method on DHM directly. Fixes GH-1955. --- .../config/DelegatingHandlerMapping.java | 23 ++++++++----------- .../RepositoryRestMvcConfiguration.java | 6 ++--- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/DelegatingHandlerMapping.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/DelegatingHandlerMapping.java index 7d542f5dd..ae2813505 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/DelegatingHandlerMapping.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/DelegatingHandlerMapping.java @@ -41,8 +41,8 @@ import org.springframework.web.util.pattern.PathPatternParser; * @author Oliver Gierke * @soundtrack Benny Greb - Stabila (Moving Parts) */ -class DelegatingHandlerMapping extends AbstractHandlerMapping - implements org.springframework.data.rest.webmvc.support.DelegatingHandlerMapping { +class DelegatingHandlerMapping + implements org.springframework.data.rest.webmvc.support.DelegatingHandlerMapping, Ordered { private final List delegates; @@ -58,15 +58,7 @@ class DelegatingHandlerMapping extends AbstractHandlerMapping this.delegates = delegates; } - @java.lang.SuppressWarnings("all") - public List getDelegates() { - return this.delegates; - } - - @Override - public void setPatternParser(PathPatternParser parser) { - - super.setPatternParser(parser); + void setPatternParser(PathPatternParser parser) { delegates.stream() // .filter(AbstractHandlerMapping.class::isInstance) // @@ -74,6 +66,11 @@ class DelegatingHandlerMapping extends AbstractHandlerMapping .forEach(it -> it.setPatternParser(parser)); } + @SuppressWarnings("all") + public List getDelegates() { + return this.delegates; + } + /* * (non-Javadoc) * @see java.lang.Iterable#iterator() @@ -94,10 +91,10 @@ class DelegatingHandlerMapping extends AbstractHandlerMapping /* * (non-Javadoc) - * @see org.springframework.web.servlet.handler.AbstractHandlerMapping#getHandlerInternal(javax.servlet.http.HttpServletRequest) + * @see org.springframework.web.servlet.HandlerMapping#getHandler(javax.servlet.http.HttpServletRequest) */ @Override - protected Object getHandlerInternal(HttpServletRequest request) throws Exception { + public HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { return HandlerSelectionResult.from(request, delegates).resultOrException(); } diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java index bb1bdf588..65ebe45fd 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java @@ -183,7 +183,7 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon private Lazy baseUri; private Lazy resourceMappings; private Lazy repositories; - private Lazy restHandlerMapping; + private Lazy restHandlerMapping; private Lazy resourceMetadataHandlerMethodArgumentResolver; private Lazy excerptProjector; private Lazy persistentEntities; @@ -241,7 +241,7 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon this.baseUri = Lazy.of(() -> context.getBean(BaseUri.class)); this.resourceMappings = Lazy.of(() -> context.getBean(RepositoryResourceMappings.class)); this.repositories = Lazy.of(() -> context.getBean(Repositories.class)); - this.restHandlerMapping = Lazy.of(() -> context.getBean("restHandlerMapping", AbstractHandlerMapping.class)); + this.restHandlerMapping = Lazy.of(() -> context.getBean("restHandlerMapping", DelegatingHandlerMapping.class)); this.resourceMetadataHandlerMethodArgumentResolver = Lazy .of(() -> context.getBean(ResourceMetadataHandlerMethodArgumentResolver.class)); this.excerptProjector = Lazy.of(() -> context.getBean(ExcerptProjector.class)); @@ -638,7 +638,7 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon * @return */ @Bean - public AbstractHandlerMapping restHandlerMapping(Repositories repositories, + public DelegatingHandlerMapping restHandlerMapping(Repositories repositories, RepositoryResourceMappings resourceMappings, Optional jpaHelper, RepositoryRestConfiguration repositoryRestConfiguration, CorsConfigurationAware corsRestConfiguration) {