Skip to content

Commit 72a8d07

Browse files
committed
DATACMNS-419 - PagedResourceAssemblerArgumentResolver now works with templated URIs.
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.
1 parent 92a2218 commit 72a8d07

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

src/main/java/org/springframework/data/web/PagedResourcesAssemblerArgumentResolver.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,7 @@ public boolean supportsParameter(MethodParameter parameter) {
8282
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
8383
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
8484

85-
Link linkToMethod = linkBuilderFactory.linkTo(parameter.getMethod(), new Object[0]).withSelfRel();
86-
UriComponents fromUriString = UriComponentsBuilder.fromUriString(linkToMethod.getHref()).build();
87-
85+
UriComponents fromUriString = resolveBaseUri(parameter);
8886
MethodParameter pageableParameter = findMatchingPageableParameter(parameter);
8987

9088
if (pageableParameter != null) {
@@ -94,6 +92,22 @@ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer m
9492
}
9593
}
9694

95+
/**
96+
* Eagerly resolve a base URI for the given {@link MethodParameter} to be handed to the assembler.
97+
*
98+
* @param parameter must not be {@literal null}.
99+
* @return the {@link UriComponents} representing the base URI, or {@literal null} if it can't be resolved eagerly.
100+
*/
101+
private UriComponents resolveBaseUri(MethodParameter parameter) {
102+
103+
try {
104+
Link linkToMethod = linkBuilderFactory.linkTo(parameter.getMethod(), new Object[0]).withSelfRel();
105+
return UriComponentsBuilder.fromUriString(linkToMethod.getHref()).build();
106+
} catch (IllegalArgumentException o_O) {
107+
return null;
108+
}
109+
}
110+
97111
/**
98112
* Returns finds the {@link MethodParameter} for a {@link Pageable} instance matching the given
99113
* {@link MethodParameter} requesting a {@link PagedResourcesAssembler}.

src/test/java/org/springframework/data/web/PagedResourcesAssemblerArgumentResolverUnitTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,18 @@ public void rejectsAmbiguityWithoutMatchingQualifiers() throws Exception {
128128
assertRejectsAmbiguity("noMatchingQualifiers");
129129
}
130130

131+
/**
132+
* @see DATACMNS-419
133+
*/
134+
@Test
135+
public void doesNotFailForTemplatedMethodMapping() throws Exception {
136+
137+
Method method = Controller.class.getMethod("methodWithPathVariable", PagedResourcesAssembler.class);
138+
Object result = resolver.resolveArgument(new MethodParameter(method, 0), null, null, null);
139+
140+
assertThat(result, is(notNullValue()));
141+
}
142+
131143
private void assertSelectsParameter(Method method, int expectedIndex) throws Exception {
132144

133145
MethodParameter parameter = new MethodParameter(method, 0);

0 commit comments

Comments
 (0)