From 72a8d072a386c1317d1dd97467888ca442582411 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 16 Jan 2014 14:34:14 +0100 Subject: [PATCH] DATACMNS-419 - PagedResourceAssemblerArgumentResolver now works with templated URIs. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We now handle an IllegalArgumentException being thrown in case we deal with a templated request mapping. We simply skip the attempt to eagerly resolve the base URI for the request and rely on the assembler being capable of resolving it itself or the user effectively providing a Link instances to one of the toResource(…) overloads. --- ...gedResourcesAssemblerArgumentResolver.java | 20 ++++++++++++++++--- ...cesAssemblerArgumentResolverUnitTests.java | 12 +++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/springframework/data/web/PagedResourcesAssemblerArgumentResolver.java b/src/main/java/org/springframework/data/web/PagedResourcesAssemblerArgumentResolver.java index 7db819a30..a0fcd9ebe 100644 --- a/src/main/java/org/springframework/data/web/PagedResourcesAssemblerArgumentResolver.java +++ b/src/main/java/org/springframework/data/web/PagedResourcesAssemblerArgumentResolver.java @@ -82,9 +82,7 @@ public class PagedResourcesAssemblerArgumentResolver implements HandlerMethodArg public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { - Link linkToMethod = linkBuilderFactory.linkTo(parameter.getMethod(), new Object[0]).withSelfRel(); - UriComponents fromUriString = UriComponentsBuilder.fromUriString(linkToMethod.getHref()).build(); - + UriComponents fromUriString = resolveBaseUri(parameter); MethodParameter pageableParameter = findMatchingPageableParameter(parameter); if (pageableParameter != null) { @@ -94,6 +92,22 @@ public class PagedResourcesAssemblerArgumentResolver implements HandlerMethodArg } } + /** + * Eagerly resolve a base URI for the given {@link MethodParameter} to be handed to the assembler. + * + * @param parameter must not be {@literal null}. + * @return the {@link UriComponents} representing the base URI, or {@literal null} if it can't be resolved eagerly. + */ + private UriComponents resolveBaseUri(MethodParameter parameter) { + + try { + Link linkToMethod = linkBuilderFactory.linkTo(parameter.getMethod(), new Object[0]).withSelfRel(); + return UriComponentsBuilder.fromUriString(linkToMethod.getHref()).build(); + } catch (IllegalArgumentException o_O) { + return null; + } + } + /** * Returns finds the {@link MethodParameter} for a {@link Pageable} instance matching the given * {@link MethodParameter} requesting a {@link PagedResourcesAssembler}. diff --git a/src/test/java/org/springframework/data/web/PagedResourcesAssemblerArgumentResolverUnitTests.java b/src/test/java/org/springframework/data/web/PagedResourcesAssemblerArgumentResolverUnitTests.java index d04609e09..122c50d56 100644 --- a/src/test/java/org/springframework/data/web/PagedResourcesAssemblerArgumentResolverUnitTests.java +++ b/src/test/java/org/springframework/data/web/PagedResourcesAssemblerArgumentResolverUnitTests.java @@ -128,6 +128,18 @@ public class PagedResourcesAssemblerArgumentResolverUnitTests { assertRejectsAmbiguity("noMatchingQualifiers"); } + /** + * @see DATACMNS-419 + */ + @Test + public void doesNotFailForTemplatedMethodMapping() throws Exception { + + Method method = Controller.class.getMethod("methodWithPathVariable", PagedResourcesAssembler.class); + Object result = resolver.resolveArgument(new MethodParameter(method, 0), null, null, null); + + assertThat(result, is(notNullValue())); + } + private void assertSelectsParameter(Method method, int expectedIndex) throws Exception { MethodParameter parameter = new MethodParameter(method, 0);