Polish "Return consistent collection type for matrix variables"
See gh-31483
This commit is contained in:
parent
ea30c8fb5b
commit
9aa707ec4b
|
@ -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) {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue