From 45ef259826fa68f484fe966d6abcc73c5cf9cd62 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 23 Apr 2014 17:56:28 +0200 Subject: [PATCH] DATAREST-292 - Fixed application of configured base URI. Major overhaul of mapping detection in RepositoryRestHandlerMapping. We now correctly map URIs if a base URI is configured via RepositoryRestConfiguration. --- .../config/RepositoryRestConfiguration.java | 2 +- .../webmvc/RepositoryRestHandlerMapping.java | 46 ++++++++++++++----- .../webmvc/support/RepositoryLinkBuilder.java | 8 ++-- ...RepositoryRestHandlerMappingUnitTests.java | 38 ++++++++++++++- 4 files changed, 75 insertions(+), 19 deletions(-) diff --git a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/config/RepositoryRestConfiguration.java b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/config/RepositoryRestConfiguration.java index 4a8edc748..6622ea1af 100644 --- a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/config/RepositoryRestConfiguration.java +++ b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/config/RepositoryRestConfiguration.java @@ -31,7 +31,7 @@ import org.springframework.util.Assert; @SuppressWarnings("deprecation") public class RepositoryRestConfiguration { - private URI baseUri = null; + private URI baseUri = URI.create(""); private int defaultPageSize = 20; private int maxPageSize = 1000; private String pageParamName = "page"; diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMapping.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMapping.java index cba198db0..8cd535b69 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMapping.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMapping.java @@ -31,8 +31,11 @@ import org.springframework.data.rest.webmvc.support.JpaHelper; import org.springframework.http.MediaType; import org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor; import org.springframework.util.Assert; +import org.springframework.util.StringUtils; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; /** * {@link RequestMappingHandlerMapping} implementation that will only find a handler method if a @@ -111,24 +114,28 @@ public class RepositoryRestHandlerMapping extends RequestMappingHandlerMapping { HttpServletRequest request = new DefaultAcceptTypeHttpServletRequest(origRequest, acceptType); - String requestUri = lookupPath; - if (requestUri.startsWith("/")) { - requestUri = requestUri.substring(1); - } - - if (!hasText(requestUri)) { + if (!hasText(lookupPath)) { return super.lookupHandlerMethod(lookupPath, request); } - String[] parts = requestUri.split("/"); + // Strip base URI + UriComponents components = UriComponentsBuilder.fromPath(lookupPath).build(); + List segments = components.getPathSegments(); + String baseUri = config.getBaseUri().toString(); + int repositoryIndex = !segments.isEmpty() && segments.get(0).equals(baseUri) ? 1 : 0; + segments = segments.subList(repositoryIndex, segments.size()); - if (parts.length == 0) { - // Root request - return super.lookupHandlerMethod(lookupPath, request); + String uri = "/".concat(StringUtils.collectionToDelimitedString(segments, "/")); + + request = new DefaultAcceptTypeHttpServletRequest(origRequest, acceptType, uri); + + // Root request + if (uri.equals("/")) { + return super.lookupHandlerMethod(uri, request); } - if (mappings.exportsTopLevelResourceFor(parts[0])) { - return super.lookupHandlerMethod(lookupPath, request); + if (mappings.exportsTopLevelResourceFor(segments.get(0))) { + return super.lookupHandlerMethod(uri, request); } return null; @@ -159,10 +166,16 @@ public class RepositoryRestHandlerMapping extends RequestMappingHandlerMapping { private static class DefaultAcceptTypeHttpServletRequest extends HttpServletRequestWrapper { private final String defaultAcceptType; + private final String requestUri; private DefaultAcceptTypeHttpServletRequest(HttpServletRequest request, String defaultAcceptType) { + this(request, defaultAcceptType, null); + } + + private DefaultAcceptTypeHttpServletRequest(HttpServletRequest request, String defaultAcceptType, String requestUri) { super(request); this.defaultAcceptType = defaultAcceptType; + this.requestUri = requestUri; } @Override @@ -174,5 +187,14 @@ public class RepositoryRestHandlerMapping extends RequestMappingHandlerMapping { return super.getHeader(name); } } + + /* + * (non-Javadoc) + * @see javax.servlet.http.HttpServletRequestWrapper#getRequestURI() + */ + @Override + public String getRequestURI() { + return requestUri != null ? requestUri : super.getRequestURI(); + } } } diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/support/RepositoryLinkBuilder.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/support/RepositoryLinkBuilder.java index 61ef5d733..7738f79ab 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/support/RepositoryLinkBuilder.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/support/RepositoryLinkBuilder.java @@ -19,10 +19,9 @@ import java.net.URI; import org.springframework.data.mapping.PersistentProperty; import org.springframework.data.rest.core.mapping.ResourceMetadata; -import org.springframework.data.rest.webmvc.RepositoryController; import org.springframework.hateoas.Link; import org.springframework.hateoas.core.LinkBuilderSupport; -import org.springframework.hateoas.mvc.ControllerLinkBuilder; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import org.springframework.web.util.UriComponentsBuilder; public class RepositoryLinkBuilder extends LinkBuilderSupport { @@ -41,9 +40,8 @@ public class RepositoryLinkBuilder extends LinkBuilderSupport