Browse Source

MapMethodProcessor supportsParameter is more specific

Closes gh-33160
pull/34398/head
rstoyanchev 1 year ago
parent
commit
66f33a8265
  1. 7
      spring-web/src/main/java/org/springframework/web/method/annotation/MapMethodProcessor.java
  2. 17
      spring-web/src/test/java/org/springframework/web/method/annotation/MapMethodProcessorTests.java

7
spring-web/src/main/java/org/springframework/web/method/annotation/MapMethodProcessor.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2022 the original author or authors.
* Copyright 2002-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -20,6 +20,7 @@ import java.util.Map; @@ -20,6 +20,7 @@ import java.util.Map;
import org.springframework.core.MethodParameter;
import org.springframework.lang.Nullable;
import org.springframework.ui.ModelMap;
import org.springframework.util.Assert;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
@ -42,7 +43,9 @@ public class MapMethodProcessor implements HandlerMethodArgumentResolver, Handle @@ -42,7 +43,9 @@ public class MapMethodProcessor implements HandlerMethodArgumentResolver, Handle
@Override
public boolean supportsParameter(MethodParameter parameter) {
return (Map.class.isAssignableFrom(parameter.getParameterType()) &&
// We don't support any type of Map
Class<?> type = parameter.getParameterType();
return ((type.isAssignableFrom(Map.class) || ModelMap.class.isAssignableFrom(type)) &&
parameter.getParameterAnnotations().length == 0);
}

17
spring-web/src/test/java/org/springframework/web/method/annotation/MapMethodProcessorTests.java

@ -16,6 +16,7 @@ @@ -16,6 +16,7 @@
package org.springframework.web.method.annotation;
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.BeforeEach;
@ -63,8 +64,13 @@ class MapMethodProcessorTests { @@ -63,8 +64,13 @@ class MapMethodProcessorTests {
void supportsParameter() {
assertThat(this.processor.supportsParameter(
this.resolvable.annotNotPresent().arg(Map.class, String.class, Object.class))).isTrue();
assertThat(this.processor.supportsParameter(
this.resolvable.annotPresent(RequestBody.class).arg(Map.class, String.class, Object.class))).isFalse();
// gh-33160
assertThat(this.processor.supportsParameter(
ResolvableMethod.on(getClass()).argTypes(ExtendedMap.class).build().arg(ExtendedMap.class))).isFalse();
}
@Test
@ -100,4 +106,15 @@ class MapMethodProcessorTests { @@ -100,4 +106,15 @@ class MapMethodProcessorTests {
return null;
}
@SuppressWarnings("unused")
private Map<String, Object> handle(ExtendedMap extendedMap) {
return null;
}
@SuppressWarnings("serial")
private static final class ExtendedMap extends HashMap<String, Object> {
}
}

Loading…
Cancel
Save