Skip to content

Commit dab48d2

Browse files
committed
Improve Error Message When Registration Missing
Closes gh-15363
1 parent caa325f commit dab48d2

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/AbstractRequestMatcherRegistry.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ private boolean isDispatcherServlet(ServletRegistration registration) {
434434
}
435435
}
436436

437-
private String computeErrorMessage(Collection<? extends ServletRegistration> registrations) {
437+
private static String computeErrorMessage(Collection<? extends ServletRegistration> registrations) {
438438
String template = "This method cannot decide whether these patterns are Spring MVC patterns or not. "
439439
+ "If this endpoint is a Spring MVC endpoint, please use requestMatchers(MvcRequestMatcher); "
440440
+ "otherwise, please use requestMatchers(AntPathRequestMatcher).\n\n"
@@ -628,7 +628,7 @@ static class DispatcherServletRequestMatcher implements RequestMatcher {
628628
public boolean matches(HttpServletRequest request) {
629629
String name = request.getHttpServletMapping().getServletName();
630630
ServletRegistration registration = this.servletContext.getServletRegistration(name);
631-
Assert.notNull(name, "Failed to find servlet [" + name + "] in the servlet context");
631+
Assert.notNull(registration, computeErrorMessage(this.servletContext.getServletRegistrations().values()));
632632
try {
633633
Class<?> clazz = Class.forName(registration.getClassName());
634634
return DispatcherServlet.class.isAssignableFrom(clazz);
@@ -670,18 +670,12 @@ RequestMatcher requestMatcher(HttpServletRequest request) {
670670

671671
@Override
672672
public boolean matches(HttpServletRequest request) {
673-
if (this.dispatcherServlet.matches(request)) {
674-
return this.mvc.matches(request);
675-
}
676-
return this.ant.matches(request);
673+
return requestMatcher(request).matches(request);
677674
}
678675

679676
@Override
680677
public MatchResult matcher(HttpServletRequest request) {
681-
if (this.dispatcherServlet.matches(request)) {
682-
return this.mvc.matcher(request);
683-
}
684-
return this.ant.matcher(request);
678+
return requestMatcher(request).matcher(request);
685679
}
686680

687681
@Override

config/src/test/java/org/springframework/security/config/annotation/web/AbstractRequestMatcherRegistryTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,19 @@ public HttpServletMapping getHttpServletMapping() {
400400
verifyNoMoreInteractions(mvc);
401401
}
402402

403+
@Test
404+
public void matchesWhenNoMappingThenException() {
405+
MockServletContext servletContext = new MockServletContext();
406+
servletContext.addServlet("default", DispatcherServlet.class).addMapping("/");
407+
servletContext.addServlet("path", Servlet.class).addMapping("/services/*");
408+
MvcRequestMatcher mvc = mock(MvcRequestMatcher.class);
409+
AntPathRequestMatcher ant = mock(AntPathRequestMatcher.class);
410+
DispatcherServletDelegatingRequestMatcher requestMatcher = new DispatcherServletDelegatingRequestMatcher(ant,
411+
mvc, servletContext);
412+
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/services/endpoint");
413+
assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> requestMatcher.matcher(request));
414+
}
415+
403416
private void mockMvcIntrospector(boolean isPresent) {
404417
ApplicationContext context = this.matcherRegistry.getApplicationContext();
405418
given(context.containsBean("mvcHandlerMappingIntrospector")).willReturn(isPresent);

0 commit comments

Comments
 (0)