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);