Polish "Return consistent collection type for matrix variables"

See gh-31483
This commit is contained in:
Stéphane Nicoll 2023-10-24 10:49:41 +02:00
parent ea30c8fb5b
commit 9aa707ec4b
4 changed files with 42 additions and 20 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2018 the original author or authors. * Copyright 2002-2023 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,7 +16,6 @@
package org.springframework.web.reactive.result.method.annotation; package org.springframework.web.reactive.result.method.annotation;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -71,12 +70,17 @@ public class MatrixVariableMapMethodArgumentResolver extends HandlerMethodArgume
Map<String, MultiValueMap<String, String>> matrixVariables = Map<String, MultiValueMap<String, String>> matrixVariables =
exchange.getAttribute(HandlerMapping.MATRIX_VARIABLES_ATTRIBUTE); exchange.getAttribute(HandlerMapping.MATRIX_VARIABLES_ATTRIBUTE);
MultiValueMap<String, String> map = mapMatrixVariables(parameter, matrixVariables);
if (CollectionUtils.isEmpty(matrixVariables)) { return (isSingleValueMap(parameter) ? map.toSingleValueMap() : map);
return Collections.emptyMap();
} }
private MultiValueMap<String,String> mapMatrixVariables(MethodParameter parameter,
@Nullable Map<String, MultiValueMap<String, String>> matrixVariables) {
MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
if (CollectionUtils.isEmpty(matrixVariables)) {
return map;
}
MatrixVariable annotation = parameter.getParameterAnnotation(MatrixVariable.class); MatrixVariable annotation = parameter.getParameterAnnotation(MatrixVariable.class);
Assert.state(annotation != null, "No MatrixVariable annotation"); Assert.state(annotation != null, "No MatrixVariable annotation");
String pathVariable = annotation.pathVar(); String pathVariable = annotation.pathVar();
@ -84,7 +88,7 @@ public class MatrixVariableMapMethodArgumentResolver extends HandlerMethodArgume
if (!pathVariable.equals(ValueConstants.DEFAULT_NONE)) { if (!pathVariable.equals(ValueConstants.DEFAULT_NONE)) {
MultiValueMap<String, String> mapForPathVariable = matrixVariables.get(pathVariable); MultiValueMap<String, String> mapForPathVariable = matrixVariables.get(pathVariable);
if (mapForPathVariable == null) { if (mapForPathVariable == null) {
return Collections.emptyMap(); return map;
} }
map.putAll(mapForPathVariable); map.putAll(mapForPathVariable);
} }
@ -97,8 +101,7 @@ public class MatrixVariableMapMethodArgumentResolver extends HandlerMethodArgume
}); });
} }
} }
return map;
return (isSingleValueMap(parameter) ? map.toSingleValueMap() : map);
} }
private boolean isSingleValueMap(MethodParameter parameter) { private boolean isSingleValueMap(MethodParameter parameter) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2019 the original author or authors. * Copyright 2002-2023 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -22,6 +22,7 @@ import java.util.Collections;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import org.assertj.core.api.InstanceOfAssertFactories;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -139,6 +140,19 @@ public class MatrixVariablesMapMethodArgumentResolverTests {
assertThat(mapAll.get("colors")).isEqualTo("red"); assertThat(mapAll.get("colors")).isEqualTo("red");
} }
@Test
public void resolveMultiValueMapArgumentNoParams() {
MethodParameter param = this.testMethod.annot(matrixAttribute().noPathVar())
.arg(MultiValueMap.class, String.class, String.class);
Object result = this.resolver.resolveArgument(param,
new BindingContext(), this.exchange).block(Duration.ZERO);
assertThat(result).isInstanceOf(MultiValueMap.class)
.asInstanceOf(InstanceOfAssertFactories.MAP).isEmpty();
}
@Test @Test
public void resolveArgumentNoParams() throws Exception { public void resolveArgumentNoParams() throws Exception {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2018 the original author or authors. * Copyright 2002-2023 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,7 +16,6 @@
package org.springframework.web.servlet.mvc.method.annotation; package org.springframework.web.servlet.mvc.method.annotation;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -68,11 +67,17 @@ public class MatrixVariableMapMethodArgumentResolver implements HandlerMethodArg
(Map<String, MultiValueMap<String, String>>) request.getAttribute( (Map<String, MultiValueMap<String, String>>) request.getAttribute(
HandlerMapping.MATRIX_VARIABLES_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST); HandlerMapping.MATRIX_VARIABLES_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST);
if (CollectionUtils.isEmpty(matrixVariables)) { MultiValueMap<String, String> map = mapMatrixVariables(parameter, matrixVariables);
return (isSingleValueMap(parameter) ? Collections.emptyMap() : new LinkedMultiValueMap<>(0)); return (isSingleValueMap(parameter) ? map.toSingleValueMap() : map);
} }
private MultiValueMap<String,String> mapMatrixVariables(MethodParameter parameter,
@Nullable Map<String, MultiValueMap<String, String>> matrixVariables) {
MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
if (CollectionUtils.isEmpty(matrixVariables)) {
return map;
}
MatrixVariable ann = parameter.getParameterAnnotation(MatrixVariable.class); MatrixVariable ann = parameter.getParameterAnnotation(MatrixVariable.class);
Assert.state(ann != null, "No MatrixVariable annotation"); Assert.state(ann != null, "No MatrixVariable annotation");
String pathVariable = ann.pathVar(); String pathVariable = ann.pathVar();
@ -80,7 +85,7 @@ public class MatrixVariableMapMethodArgumentResolver implements HandlerMethodArg
if (!pathVariable.equals(ValueConstants.DEFAULT_NONE)) { if (!pathVariable.equals(ValueConstants.DEFAULT_NONE)) {
MultiValueMap<String, String> mapForPathVariable = matrixVariables.get(pathVariable); MultiValueMap<String, String> mapForPathVariable = matrixVariables.get(pathVariable);
if (mapForPathVariable == null) { if (mapForPathVariable == null) {
return Collections.emptyMap(); return map;
} }
map.putAll(mapForPathVariable); map.putAll(mapForPathVariable);
} }
@ -93,8 +98,7 @@ public class MatrixVariableMapMethodArgumentResolver implements HandlerMethodArg
}); });
} }
} }
return map;
return (isSingleValueMap(parameter) ? map.toSingleValueMap() : map);
} }
private boolean isSingleValueMap(MethodParameter parameter) { private boolean isSingleValueMap(MethodParameter parameter) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2019 the original author or authors. * Copyright 2002-2023 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -21,6 +21,7 @@ import java.util.Collections;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import org.assertj.core.api.InstanceOfAssertFactories;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -163,8 +164,8 @@ public class MatrixVariablesMapMethodArgumentResolverTests {
Object result = this.resolver.resolveArgument(param, this.mavContainer, this.webRequest, null); Object result = this.resolver.resolveArgument(param, this.mavContainer, this.webRequest, null);
//noinspection unchecked assertThat(result).isInstanceOf(MultiValueMap.class)
assertThat(result).isInstanceOfSatisfying(MultiValueMap.class, map -> assertThat(map).isEmpty()); .asInstanceOf(InstanceOfAssertFactories.MAP).isEmpty();
} }
@Test @Test