Skip to content

Commit 837dfe2

Browse files
committed
Set PathPatternParser in RouterFunctionMapping
See gh-24945
1 parent 734f4a4 commit 837dfe2

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

Diff for: spring-webmvc/src/main/java/org/springframework/web/servlet/function/support/RouterFunctionMapping.java

+4
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.springframework.web.servlet.function.RouterFunctions;
3939
import org.springframework.web.servlet.function.ServerRequest;
4040
import org.springframework.web.servlet.handler.AbstractHandlerMapping;
41+
import org.springframework.web.util.pattern.PathPatternParser;
4142

4243
/**
4344
* {@code HandlerMapping} implementation that supports {@link RouterFunction RouterFunctions}.
@@ -76,6 +77,9 @@ public class RouterFunctionMapping extends AbstractHandlerMapping implements Ini
7677
* {@link RouterFunction} instances available in the application context.
7778
*/
7879
public RouterFunctionMapping() {
80+
// gh-23236 will ensure the configured parser is used to parse patterns
81+
// For now this helps to signal to the DispatcherServlet the need to initialize the RequestPath
82+
setPatternParser(new PathPatternParser());
7983
}
8084

8185
/**

Diff for: spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java

+28-2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252

5353
import javax.servlet.ServletConfig;
5454
import javax.servlet.ServletContext;
55+
import javax.servlet.ServletException;
5556
import javax.servlet.http.Cookie;
5657
import javax.servlet.http.HttpServletRequest;
5758
import javax.servlet.http.HttpServletResponse;
@@ -60,6 +61,8 @@
6061
import javax.validation.constraints.NotNull;
6162
import javax.xml.bind.annotation.XmlRootElement;
6263

64+
import org.junit.jupiter.api.Test;
65+
6366
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
6467
import org.springframework.aop.interceptor.SimpleTraceInterceptor;
6568
import org.springframework.aop.support.DefaultPointcutAdvisor;
@@ -134,11 +137,16 @@
134137
import org.springframework.web.context.WebApplicationContext;
135138
import org.springframework.web.context.request.NativeWebRequest;
136139
import org.springframework.web.context.request.WebRequest;
140+
import org.springframework.web.context.support.GenericWebApplicationContext;
137141
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
138142
import org.springframework.web.multipart.support.StringMultipartFileEditor;
143+
import org.springframework.web.servlet.DispatcherServlet;
139144
import org.springframework.web.servlet.ModelAndView;
140145
import org.springframework.web.servlet.View;
141146
import org.springframework.web.servlet.ViewResolver;
147+
import org.springframework.web.servlet.function.RouterFunction;
148+
import org.springframework.web.servlet.function.RouterFunctions;
149+
import org.springframework.web.servlet.function.ServerResponse;
142150
import org.springframework.web.servlet.handler.PathPatternsParameterizedTest;
143151
import org.springframework.web.servlet.mvc.annotation.ModelAndViewResolver;
144152
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
@@ -163,12 +171,10 @@
163171
*/
164172
public class ServletAnnotationControllerHandlerMethodTests extends AbstractServletHandlerMethodTests {
165173

166-
@SuppressWarnings("unused")
167174
static Stream<Boolean> pathPatternsArguments() {
168175
return Stream.of(true, false);
169176
}
170177

171-
172178
@PathPatternsParameterizedTest
173179
void emptyValueMapping(boolean usePathPatterns) throws Exception {
174180
initDispatcherServlet(ControllerWithEmptyValueMapping.class, usePathPatterns);
@@ -2099,6 +2105,26 @@ void dataClassBindingWithLocalDate(boolean usePathPatterns) throws Exception {
20992105
assertThat(response.getContentAsString()).isEqualTo("2010-01-01");
21002106
}
21012107

2108+
@Test
2109+
void routerFunction() throws ServletException, IOException {
2110+
GenericWebApplicationContext wac = new GenericWebApplicationContext();
2111+
wac.registerBean(RouterFunction.class, () ->
2112+
RouterFunctions.route()
2113+
.GET("/foo", request -> ServerResponse.ok().body("foo-body"))
2114+
.build());
2115+
wac.refresh();
2116+
2117+
DispatcherServlet servlet = new DispatcherServlet();
2118+
servlet.setApplicationContext(wac);
2119+
servlet.init(new MockServletConfig());
2120+
2121+
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo");
2122+
MockHttpServletResponse response = new MockHttpServletResponse();
2123+
servlet.service(request, response);
2124+
2125+
assertThat(response.getStatus()).isEqualTo(200);
2126+
assertThat(response.getContentAsString()).isEqualTo("foo-body");
2127+
}
21022128

21032129
@Controller
21042130
static class ControllerWithEmptyValueMapping {

0 commit comments

Comments
 (0)