From 4d7daa9f6e0b2edbf526b35fa330be392e67507b 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 88ebe026c..4d819f6c9 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 @@ -182,7 +182,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; @@ -240,7 +240,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)); @@ -637,7 +637,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) {