diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodMapping.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodMapping.java index e8f842b35d..4b6d0315d8 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodMapping.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodMapping.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,6 +48,7 @@ import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.CorsUtils; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.util.pattern.PathPatternParser; /** * Abstract base class for {@link HandlerMapping} implementations that define @@ -99,6 +100,14 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap private final MappingRegistry mappingRegistry = new MappingRegistry(); + @Override + public void setPatternParser(PathPatternParser patternParser) { + Assert.state(this.mappingRegistry.getRegistrations().isEmpty(), + "PathPatternParser must be set before the initialization of " + + "request mappings through InitializingBean#afterPropertiesSet."); + super.setPatternParser(patternParser); + } + /** * Whether to detect handler methods in beans in ancestor ApplicationContexts. *

Default is "false": Only beans in the current ApplicationContext are diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java index 3841449aec..589c3aecd5 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java @@ -41,6 +41,7 @@ import org.springframework.web.servlet.HandlerMapping; import org.springframework.web.util.ServletRequestPathUtils; import org.springframework.web.util.UrlPathHelper; import org.springframework.web.util.pattern.PathPattern; +import org.springframework.web.util.pattern.PathPatternParser; /** * Abstract base class for URL-mapped {@link HandlerMapping} implementations. @@ -74,6 +75,14 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping i private final Map pathPatternHandlerMap = new LinkedHashMap<>(); + @Override + public void setPatternParser(PathPatternParser patternParser) { + Assert.state(this.handlerMap.isEmpty(), + "PathPatternParser must be set before the initialization of " + + "the handler map via ApplicationContextAware#setApplicationContext."); + super.setPatternParser(patternParser); + } + /** * Set the root handler for this handler mapping, that is, * the handler to be registered for the root path ("/").