Polishing
This commit is contained in:
@@ -189,16 +189,13 @@ public class RequestMappingHandlerMapping extends RequestMappingInfoHandlerMappi
|
||||
|
||||
MergedAnnotations mergedAnnotations = MergedAnnotations.from(element, SearchStrategy.TYPE_HIERARCHY,
|
||||
RepeatableContainers.none());
|
||||
List<AnnotationDescriptor<RequestMapping>> requestMappings = mergedAnnotations.stream(RequestMapping.class)
|
||||
.filter(MergedAnnotationPredicates.firstRunOf(MergedAnnotation::getAggregateIndex))
|
||||
.map(AnnotationDescriptor::new)
|
||||
.distinct()
|
||||
.toList();
|
||||
|
||||
List<AnnotationDescriptor<RequestMapping>> requestMappings = getAnnotationDescriptors(
|
||||
mergedAnnotations, RequestMapping.class);
|
||||
if (!requestMappings.isEmpty()) {
|
||||
if (requestMappings.size() > 1 && logger.isWarnEnabled()) {
|
||||
logger.warn("Multiple @RequestMapping annotations found on %s, but only the first will be used: %s"
|
||||
.formatted(element, requestMappings));
|
||||
.formatted(element, requestMappings));
|
||||
}
|
||||
return createRequestMappingInfo(requestMappings.get(0).annotation, customCondition);
|
||||
}
|
||||
@@ -430,6 +427,16 @@ public class RequestMappingHandlerMapping extends RequestMappingInfoHandlerMappi
|
||||
}
|
||||
}
|
||||
|
||||
private static <A extends Annotation> List<AnnotationDescriptor<A>> getAnnotationDescriptors(
|
||||
MergedAnnotations mergedAnnotations, Class<A> annotationType) {
|
||||
|
||||
return mergedAnnotations.stream(annotationType)
|
||||
.filter(MergedAnnotationPredicates.firstRunOf(MergedAnnotation::getAggregateIndex))
|
||||
.map(AnnotationDescriptor::new)
|
||||
.distinct()
|
||||
.toList();
|
||||
}
|
||||
|
||||
private static class AnnotationDescriptor<A extends Annotation> {
|
||||
|
||||
private final A annotation;
|
||||
|
||||
@@ -349,16 +349,13 @@ public class RequestMappingHandlerMapping extends RequestMappingInfoHandlerMappi
|
||||
|
||||
MergedAnnotations mergedAnnotations = MergedAnnotations.from(element, SearchStrategy.TYPE_HIERARCHY,
|
||||
RepeatableContainers.none());
|
||||
List<AnnotationDescriptor<RequestMapping>> requestMappings = mergedAnnotations.stream(RequestMapping.class)
|
||||
.filter(MergedAnnotationPredicates.firstRunOf(MergedAnnotation::getAggregateIndex))
|
||||
.map(AnnotationDescriptor::new)
|
||||
.distinct()
|
||||
.toList();
|
||||
|
||||
List<AnnotationDescriptor<RequestMapping>> requestMappings = getAnnotationDescriptors(
|
||||
mergedAnnotations, RequestMapping.class);
|
||||
if (!requestMappings.isEmpty()) {
|
||||
if (requestMappings.size() > 1 && logger.isWarnEnabled()) {
|
||||
logger.warn("Multiple @RequestMapping annotations found on %s, but only the first will be used: %s"
|
||||
.formatted(element, requestMappings));
|
||||
.formatted(element, requestMappings));
|
||||
}
|
||||
return createRequestMappingInfo(requestMappings.get(0).annotation, customCondition);
|
||||
}
|
||||
@@ -609,6 +606,16 @@ public class RequestMappingHandlerMapping extends RequestMappingInfoHandlerMappi
|
||||
}
|
||||
}
|
||||
|
||||
private static <A extends Annotation> List<AnnotationDescriptor<A>> getAnnotationDescriptors(
|
||||
MergedAnnotations mergedAnnotations, Class<A> annotationType) {
|
||||
|
||||
return mergedAnnotations.stream(annotationType)
|
||||
.filter(MergedAnnotationPredicates.firstRunOf(MergedAnnotation::getAggregateIndex))
|
||||
.map(AnnotationDescriptor::new)
|
||||
.distinct()
|
||||
.toList();
|
||||
}
|
||||
|
||||
private static class AnnotationDescriptor<A extends Annotation> {
|
||||
|
||||
private final A annotation;
|
||||
|
||||
@@ -71,12 +71,12 @@ class RequestMappingHandlerMappingTests {
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
static Stream<Arguments> pathPatternsArguments() {
|
||||
RequestMappingHandlerMapping mapping1 = new RequestMappingHandlerMapping();
|
||||
StaticWebApplicationContext wac1 = new StaticWebApplicationContext();
|
||||
mapping1.setApplicationContext(wac1);
|
||||
|
||||
StaticWebApplicationContext wac2 = new StaticWebApplicationContext();
|
||||
|
||||
RequestMappingHandlerMapping mapping1 = new RequestMappingHandlerMapping();
|
||||
mapping1.setApplicationContext(wac1);
|
||||
|
||||
RequestMappingHandlerMapping mapping2 = new RequestMappingHandlerMapping();
|
||||
mapping2.setPatternParser(null);
|
||||
mapping2.setApplicationContext(wac2);
|
||||
@@ -86,8 +86,7 @@ class RequestMappingHandlerMappingTests {
|
||||
|
||||
@Test
|
||||
void builderConfiguration() {
|
||||
RequestMappingHandlerMapping mapping = new RequestMappingHandlerMapping();
|
||||
mapping.setApplicationContext(new StaticWebApplicationContext());
|
||||
RequestMappingHandlerMapping mapping = createMapping();
|
||||
|
||||
RequestMappingInfo.BuilderConfiguration config = mapping.getBuilderConfiguration();
|
||||
assertThat(config).isNotNull();
|
||||
@@ -99,22 +98,20 @@ class RequestMappingHandlerMappingTests {
|
||||
@Test
|
||||
@SuppressWarnings("deprecation")
|
||||
void useRegisteredSuffixPatternMatch() {
|
||||
|
||||
RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping();
|
||||
handlerMapping.setApplicationContext(new StaticWebApplicationContext());
|
||||
RequestMappingHandlerMapping mapping = createMapping();
|
||||
|
||||
Map<String, MediaType> fileExtensions = Collections.singletonMap("json", MediaType.APPLICATION_JSON);
|
||||
org.springframework.web.accept.PathExtensionContentNegotiationStrategy strategy =
|
||||
new org.springframework.web.accept.PathExtensionContentNegotiationStrategy(fileExtensions);
|
||||
ContentNegotiationManager manager = new ContentNegotiationManager(strategy);
|
||||
|
||||
handlerMapping.setContentNegotiationManager(manager);
|
||||
handlerMapping.setUseRegisteredSuffixPatternMatch(true);
|
||||
handlerMapping.afterPropertiesSet();
|
||||
mapping.setContentNegotiationManager(manager);
|
||||
mapping.setUseRegisteredSuffixPatternMatch(true);
|
||||
mapping.afterPropertiesSet();
|
||||
|
||||
assertThat(handlerMapping.useSuffixPatternMatch()).isTrue();
|
||||
assertThat(handlerMapping.useRegisteredSuffixPatternMatch()).isTrue();
|
||||
assertThat(handlerMapping.getFileExtensions()).isEqualTo(Collections.singletonList("json"));
|
||||
assertThat(mapping.useSuffixPatternMatch()).isTrue();
|
||||
assertThat(mapping.useRegisteredSuffixPatternMatch()).isTrue();
|
||||
assertThat(mapping.getFileExtensions()).isEqualTo(Collections.singletonList("json"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -150,25 +147,24 @@ class RequestMappingHandlerMappingTests {
|
||||
@Test
|
||||
@SuppressWarnings("deprecation")
|
||||
void suffixPatternMatchSettings() {
|
||||
RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping();
|
||||
RequestMappingHandlerMapping mapping = createMapping();
|
||||
|
||||
assertThat(handlerMapping.useSuffixPatternMatch()).isFalse();
|
||||
assertThat(handlerMapping.useRegisteredSuffixPatternMatch()).isFalse();
|
||||
assertThat(mapping.useSuffixPatternMatch()).isFalse();
|
||||
assertThat(mapping.useRegisteredSuffixPatternMatch()).isFalse();
|
||||
|
||||
handlerMapping.setUseRegisteredSuffixPatternMatch(false);
|
||||
assertThat(handlerMapping.useSuffixPatternMatch())
|
||||
mapping.setUseRegisteredSuffixPatternMatch(false);
|
||||
assertThat(mapping.useSuffixPatternMatch())
|
||||
.as("'false' registeredSuffixPatternMatch shouldn't impact suffixPatternMatch")
|
||||
.isFalse();
|
||||
|
||||
handlerMapping.setUseRegisteredSuffixPatternMatch(true);
|
||||
assertThat(handlerMapping.useSuffixPatternMatch())
|
||||
mapping.setUseRegisteredSuffixPatternMatch(true);
|
||||
assertThat(mapping.useSuffixPatternMatch())
|
||||
.as("'true' registeredSuffixPatternMatch should enable suffixPatternMatch")
|
||||
.isTrue();
|
||||
}
|
||||
|
||||
@PathPatternsParameterizedTest
|
||||
void resolveEmbeddedValuesInPatterns(RequestMappingHandlerMapping mapping) {
|
||||
|
||||
mapping.setEmbeddedValueResolver(
|
||||
value -> "/${pattern}/bar".equals(value) ? "/foo/bar" : value
|
||||
);
|
||||
@@ -181,7 +177,6 @@ class RequestMappingHandlerMappingTests {
|
||||
|
||||
@PathPatternsParameterizedTest
|
||||
void pathPrefix(RequestMappingHandlerMapping mapping) throws Exception {
|
||||
|
||||
mapping.setEmbeddedValueResolver(value -> "/${prefix}".equals(value) ? "/api" : value);
|
||||
mapping.setPathPrefixes(Collections.singletonMap(
|
||||
"/${prefix}", HandlerTypePredicate.forAnnotation(RestController.class)));
|
||||
@@ -226,7 +221,6 @@ class RequestMappingHandlerMappingTests {
|
||||
|
||||
@PathPatternsParameterizedTest
|
||||
void resolveRequestMappingViaComposedAnnotation(RequestMappingHandlerMapping mapping) {
|
||||
|
||||
RequestMappingInfo info = assertComposedAnnotationMapping(
|
||||
mapping, "postJson", "/postJson", RequestMethod.POST);
|
||||
|
||||
@@ -285,9 +279,7 @@ class RequestMappingHandlerMappingTests {
|
||||
@SuppressWarnings("DataFlowIssue")
|
||||
@Test
|
||||
void httpExchangeWithDefaultValues() throws NoSuchMethodException {
|
||||
RequestMappingHandlerMapping mapping = new RequestMappingHandlerMapping();
|
||||
mapping.setApplicationContext(new StaticWebApplicationContext());
|
||||
mapping.afterPropertiesSet();
|
||||
RequestMappingHandlerMapping mapping = createMapping();
|
||||
|
||||
RequestMappingInfo mappingInfo = mapping.getMappingForMethod(
|
||||
HttpExchangeController.class.getMethod("defaultValuesExchange"),
|
||||
@@ -307,9 +299,7 @@ class RequestMappingHandlerMappingTests {
|
||||
@SuppressWarnings("DataFlowIssue")
|
||||
@Test
|
||||
void httpExchangeWithCustomValues() throws Exception {
|
||||
RequestMappingHandlerMapping mapping = new RequestMappingHandlerMapping();
|
||||
mapping.setApplicationContext(new StaticWebApplicationContext());
|
||||
mapping.afterPropertiesSet();
|
||||
RequestMappingHandlerMapping mapping = createMapping();
|
||||
|
||||
RequestMappingInfo mappingInfo = mapping.getMappingForMethod(
|
||||
HttpExchangeController.class.getMethod("customValuesExchange"),
|
||||
@@ -332,9 +322,15 @@ class RequestMappingHandlerMappingTests {
|
||||
.containsOnly(MediaType.valueOf("text/plain;charset=UTF-8"));
|
||||
}
|
||||
|
||||
private RequestMappingInfo assertComposedAnnotationMapping(RequestMethod requestMethod) {
|
||||
private static RequestMappingHandlerMapping createMapping() {
|
||||
RequestMappingHandlerMapping mapping = new RequestMappingHandlerMapping();
|
||||
mapping.setApplicationContext(new StaticWebApplicationContext());
|
||||
mapping.afterPropertiesSet();
|
||||
return mapping;
|
||||
}
|
||||
|
||||
private static RequestMappingInfo assertComposedAnnotationMapping(RequestMethod requestMethod) {
|
||||
RequestMappingHandlerMapping mapping = createMapping();
|
||||
|
||||
String methodName = requestMethod.name().toLowerCase();
|
||||
String path = "/" + methodName;
|
||||
@@ -342,7 +338,7 @@ class RequestMappingHandlerMappingTests {
|
||||
return assertComposedAnnotationMapping(mapping, methodName, path, requestMethod);
|
||||
}
|
||||
|
||||
private RequestMappingInfo assertComposedAnnotationMapping(
|
||||
private static RequestMappingInfo assertComposedAnnotationMapping(
|
||||
RequestMappingHandlerMapping mapping, String methodName, String path, RequestMethod requestMethod) {
|
||||
|
||||
Class<?> clazz = ComposedAnnotationController.class;
|
||||
|
||||
Reference in New Issue
Block a user