Skip to content

Commit c1d5807

Browse files
committed
Failure to look up repository metadata is now rejected with a 404 Not Found.
We now produce an HttpClientErrorException if ResourceMetadataHandlerMethodArgumentResolver fails for find metadata for a parsed repository key so that it automatically results in a 404 Not Found status code over a previous 500 Internal Server Error. Fixes GH-2480
1 parent a133cce commit c1d5807

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/ResourceMetadataHandlerMethodArgumentResolver.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@
2424
import org.springframework.data.rest.core.mapping.ResourceMetadata;
2525
import org.springframework.data.rest.webmvc.BaseUri;
2626
import org.springframework.data.rest.webmvc.util.UriUtils;
27+
import org.springframework.http.HttpStatus;
2728
import org.springframework.util.Assert;
2829
import org.springframework.web.bind.support.WebDataBinderFactory;
30+
import org.springframework.web.client.HttpClientErrorException;
2931
import org.springframework.web.context.request.NativeWebRequest;
3032
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
3133
import org.springframework.web.method.support.ModelAndViewContainer;
@@ -86,6 +88,6 @@ public ResourceMetadata resolveArgument(MethodParameter parameter, ModelAndViewC
8688
}
8789
}
8890

89-
throw new IllegalArgumentException(String.format("Could not resolve repository metadata for %s.", repositoryKey));
91+
throw new HttpClientErrorException(HttpStatus.NOT_FOUND);
9092
}
9193
}

spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/ResourceMetadataHandlerMethodArgumentResolverUnitTests.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,20 @@
1919
import static org.mockito.Mockito.*;
2020

2121
import org.junit.jupiter.api.Test;
22+
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
2223
import org.springframework.core.MethodParameter;
2324
import org.springframework.data.repository.support.Repositories;
2425
import org.springframework.data.rest.core.mapping.ResourceMappings;
2526
import org.springframework.data.rest.core.mapping.ResourceMetadata;
2627
import org.springframework.data.rest.webmvc.BaseUri;
28+
import org.springframework.mock.web.MockHttpServletRequest;
29+
import org.springframework.web.bind.annotation.GetMapping;
30+
import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
31+
import org.springframework.web.bind.support.DefaultDataBinderFactory;
32+
import org.springframework.web.client.HttpClientErrorException;
33+
import org.springframework.web.context.request.ServletWebRequest;
2734
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
35+
import org.springframework.web.method.support.ModelAndViewContainer;
2836

2937
/**
3038
* Unit tests for {@link ResourceMetadataHandlerMethodArgumentResolver}.
@@ -44,4 +52,29 @@ void supportsResourceMetadataParameterType() {
4452

4553
assertThat(resolver.supportsParameter(parameter)).isTrue();
4654
}
55+
56+
@Test // GH-2480
57+
void failedMetadataLookupResultsInNotFound() throws Exception {
58+
59+
var repositories = new Repositories(new DefaultListableBeanFactory());
60+
61+
var resolver = new ResourceMetadataHandlerMethodArgumentResolver(repositories,
62+
mock(ResourceMappings.class), BaseUri.NONE);
63+
64+
var method = SampleController.class.getDeclaredMethod("method", ResourceMappings.class);
65+
var parameter = new MethodParameter(method, 0);
66+
67+
var request = new MockHttpServletRequest();
68+
request.setRequestURI("/some/foo");
69+
70+
assertThatExceptionOfType(HttpClientErrorException.class).isThrownBy(
71+
() -> resolver.resolveArgument(parameter, new ModelAndViewContainer(), new ServletWebRequest(request),
72+
new DefaultDataBinderFactory(new ConfigurableWebBindingInitializer())));
73+
}
74+
75+
static class SampleController {
76+
77+
@GetMapping("/some/{repository}")
78+
void method(ResourceMappings mappings) {}
79+
}
4780
}

0 commit comments

Comments
 (0)