Optimize object creation PartialMatchHelper
See gh-29634
This commit is contained in:
@@ -36,6 +36,7 @@ import org.springframework.http.MediaType;
|
||||
import org.springframework.http.server.PathContainer;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.filter.reactive.ServerHttpObservationFilter;
|
||||
@@ -169,7 +170,7 @@ public abstract class RequestMappingInfoHandlerMapping extends AbstractHandlerMe
|
||||
protected HandlerMethod handleNoMatch(Set<RequestMappingInfo> infos,
|
||||
ServerWebExchange exchange) throws Exception {
|
||||
|
||||
PartialMatchHelper helper = new PartialMatchHelper(infos, exchange);
|
||||
PartialMatchHelper helper = PartialMatchHelper.from(infos, exchange);
|
||||
|
||||
if (helper.isEmpty()) {
|
||||
return null;
|
||||
@@ -219,17 +220,27 @@ public abstract class RequestMappingInfoHandlerMapping extends AbstractHandlerMe
|
||||
/**
|
||||
* Aggregate all partial matches and expose methods checking across them.
|
||||
*/
|
||||
private static class PartialMatchHelper {
|
||||
private static final class PartialMatchHelper {
|
||||
|
||||
private static final PartialMatchHelper EMPTY_HELPER = new PartialMatchHelper(Collections.emptySet(), null);
|
||||
|
||||
private final List<PartialMatch> partialMatches = new ArrayList<>();
|
||||
|
||||
|
||||
public PartialMatchHelper(Set<RequestMappingInfo> infos, ServerWebExchange exchange) {
|
||||
this.partialMatches.addAll(infos.stream()
|
||||
.filter(info -> info.getPatternsCondition().getMatchingCondition(exchange) != null)
|
||||
.map(info -> new PartialMatch(info, exchange)).toList());
|
||||
private PartialMatchHelper(Set<RequestMappingInfo> infos, ServerWebExchange exchange) {
|
||||
for (RequestMappingInfo info : infos) {
|
||||
if (info.getPatternsCondition().getMatchingCondition(exchange) != null) {
|
||||
this.partialMatches.add(new PartialMatch(info, exchange));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static PartialMatchHelper from(Set<RequestMappingInfo> infos, ServerWebExchange exchange) {
|
||||
if (CollectionUtils.isEmpty(infos)) {
|
||||
return EMPTY_HELPER;
|
||||
}
|
||||
return new PartialMatchHelper(infos, exchange);
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether there are any partial matches.
|
||||
|
||||
@@ -21,6 +21,7 @@ import java.net.URI;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@@ -345,6 +346,17 @@ public class RequestMappingInfoHandlerMappingTests {
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handleNoMatchEmptyRequestMappingInfo() throws Exception {
|
||||
ServerWebExchange exchange = MockServerWebExchange.from(post("/bar"));
|
||||
|
||||
HandlerMethod handlerMethod = this.handlerMapping.handleNoMatch(new HashSet<>(), exchange);
|
||||
assertThat(handlerMethod).isNull();
|
||||
|
||||
handlerMethod = this.handlerMapping.handleNoMatch(null, exchange);
|
||||
assertThat(handlerMethod).isNull();
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private <T> void assertError(Mono<Object> mono, final Class<T> exceptionClass, final Consumer<T> consumer) {
|
||||
|
||||
@@ -246,7 +246,7 @@ public abstract class RequestMappingInfoHandlerMapping extends AbstractHandlerMe
|
||||
protected HandlerMethod handleNoMatch(
|
||||
Set<RequestMappingInfo> infos, String lookupPath, HttpServletRequest request) throws ServletException {
|
||||
|
||||
PartialMatchHelper helper = new PartialMatchHelper(infos, request);
|
||||
PartialMatchHelper helper = PartialMatchHelper.from(infos, request);
|
||||
if (helper.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
@@ -293,11 +293,13 @@ public abstract class RequestMappingInfoHandlerMapping extends AbstractHandlerMe
|
||||
/**
|
||||
* Aggregate all partial matches and expose methods checking across them.
|
||||
*/
|
||||
private static class PartialMatchHelper {
|
||||
private static final class PartialMatchHelper {
|
||||
|
||||
private static final PartialMatchHelper EMPTY_HELPER = new PartialMatchHelper(Collections.emptySet(), null);
|
||||
|
||||
private final List<PartialMatch> partialMatches = new ArrayList<>();
|
||||
|
||||
public PartialMatchHelper(Set<RequestMappingInfo> infos, HttpServletRequest request) {
|
||||
private PartialMatchHelper(Set<RequestMappingInfo> infos, HttpServletRequest request) {
|
||||
for (RequestMappingInfo info : infos) {
|
||||
if (info.getActivePatternsCondition().getMatchingCondition(request) != null) {
|
||||
this.partialMatches.add(new PartialMatch(info, request));
|
||||
@@ -305,6 +307,13 @@ public abstract class RequestMappingInfoHandlerMapping extends AbstractHandlerMe
|
||||
}
|
||||
}
|
||||
|
||||
public static PartialMatchHelper from(Set<RequestMappingInfo> infos, HttpServletRequest request) {
|
||||
if (CollectionUtils.isEmpty(infos)) {
|
||||
return EMPTY_HELPER;
|
||||
}
|
||||
return new PartialMatchHelper(infos, request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether there are any partial matches.
|
||||
*/
|
||||
|
||||
@@ -25,6 +25,7 @@ import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import jakarta.servlet.ServletException;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -397,6 +398,17 @@ class RequestMappingInfoHandlerMappingTests {
|
||||
assertThat(uriVariables.get("cars")).isEqualTo("cars");
|
||||
}
|
||||
|
||||
@PathPatternsParameterizedTest
|
||||
void handleNoMatchEmptyRequestMappingInfo(TestRequestMappingInfoHandlerMapping mapping) throws ServletException {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/cars;color=green");
|
||||
|
||||
HandlerMethod handlerMethod = mapping.handleNoMatch(new HashSet<>(), "/{cars}", request);
|
||||
assertThat(handlerMethod).isNull();
|
||||
|
||||
handlerMethod = mapping.handleNoMatch(null, "/{cars}", request);
|
||||
assertThat(handlerMethod).isNull();
|
||||
}
|
||||
|
||||
private HandlerMethod getHandler(
|
||||
TestRequestMappingInfoHandlerMapping mapping, MockHttpServletRequest request) throws Exception {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user