T
- The mapping for a HandlerMethod
containing the conditions
needed to match the handler method to incoming request.public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMapping implements InitializingBean
HandlerMapping
implementations that define
a mapping between a request and a HandlerMethod
.
For each registered handler method, a unique mapping is maintained with
subclasses defining the details of the mapping type <T>
.
Modifier and Type | Class and Description |
---|---|
private static class |
AbstractHandlerMethodMapping.EmptyHandler |
private static class |
AbstractHandlerMethodMapping.MappingRegistration<T> |
(package private) class |
AbstractHandlerMethodMapping.MappingRegistry
A registry that maintains all mappings to handler methods, exposing methods
to perform lookups and providing concurrent access.
|
private class |
AbstractHandlerMethodMapping.Match
A thin wrapper around a matched HandlerMethod and its mapping, for the purpose of
comparing the best match with a comparator in the context of the current request.
|
private class |
AbstractHandlerMethodMapping.MatchComparator |
Modifier and Type | Field and Description |
---|---|
private static CorsConfiguration |
ALLOW_CORS_CONFIG |
private boolean |
detectHandlerMethodsInAncestorContexts |
private AbstractHandlerMethodMapping.MappingRegistry |
mappingRegistry |
private HandlerMethodMappingNamingStrategy<T> |
namingStrategy |
private static HandlerMethod |
PREFLIGHT_AMBIGUOUS_MATCH |
private static java.lang.String |
SCOPED_TARGET_NAME_PREFIX
Bean name prefix for target beans behind scoped proxies.
|
logger
BEST_MATCHING_HANDLER_ATTRIBUTE, BEST_MATCHING_PATTERN_ATTRIBUTE, INTROSPECT_TYPE_LEVEL_MAPPING, MATRIX_VARIABLES_ATTRIBUTE, PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE, URI_TEMPLATE_VARIABLES_ATTRIBUTE
HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE
Constructor and Description |
---|
AbstractHandlerMethodMapping() |
Modifier and Type | Method and Description |
---|---|
private void |
addMatchingMappings(java.util.Collection<T> mappings,
java.util.List<AbstractHandlerMethodMapping.Match> matches,
HttpServletRequest request) |
void |
afterPropertiesSet()
Detects handler methods at initialization.
|
protected HandlerMethod |
createHandlerMethod(java.lang.Object handler,
java.lang.reflect.Method method)
Create the HandlerMethod instance.
|
protected void |
detectHandlerMethods(java.lang.Object handler)
Look for handler methods in a handler.
|
protected CorsConfiguration |
getCorsConfiguration(java.lang.Object handler,
HttpServletRequest request)
Retrieve the CORS configuration for the given handler.
|
protected HandlerMethod |
getHandlerInternal(HttpServletRequest request)
Look up a handler method for the given request.
|
java.util.Map<T,HandlerMethod> |
getHandlerMethods()
Return a (read-only) map with all mappings and HandlerMethod's.
|
java.util.List<HandlerMethod> |
getHandlerMethodsForMappingName(java.lang.String mappingName)
Return the handler methods for the given mapping name.
|
protected abstract java.util.Comparator<T> |
getMappingComparator(HttpServletRequest request)
Return a comparator for sorting matching mappings.
|
protected abstract T |
getMappingForMethod(java.lang.reflect.Method method,
java.lang.Class<?> handlerType)
Provide the mapping for a handler method.
|
protected abstract java.util.Set<java.lang.String> |
getMappingPathPatterns(T mapping)
Extract and return the URL paths contained in a mapping.
|
(package private) AbstractHandlerMethodMapping.MappingRegistry |
getMappingRegistry()
Return the internal mapping registry.
|
protected abstract T |
getMatchingMapping(T mapping,
HttpServletRequest request)
Check if a mapping matches the current request and return a (potentially
new) mapping with conditions relevant to the current request.
|
HandlerMethodMappingNamingStrategy<T> |
getNamingStrategy()
Return the configured naming strategy or
null . |
protected void |
handleMatch(T mapping,
java.lang.String lookupPath,
HttpServletRequest request)
Invoked when a matching mapping is found.
|
protected HandlerMethod |
handleNoMatch(java.util.Set<T> mappings,
java.lang.String lookupPath,
HttpServletRequest request)
Invoked when no matching mapping is not found.
|
protected void |
handlerMethodsInitialized(java.util.Map<T,HandlerMethod> handlerMethods)
Invoked after all handler methods have been detected.
|
protected CorsConfiguration |
initCorsConfiguration(java.lang.Object handler,
java.lang.reflect.Method method,
T mapping)
Extract and return the CORS configuration for the mapping.
|
protected void |
initHandlerMethods()
Scan beans in the ApplicationContext, detect and register handler methods.
|
protected abstract boolean |
isHandler(java.lang.Class<?> beanType)
Whether the given type is a handler with handler methods.
|
protected HandlerMethod |
lookupHandlerMethod(java.lang.String lookupPath,
HttpServletRequest request)
Look up the best-matching handler method for the current request.
|
protected void |
registerHandlerMethod(java.lang.Object handler,
java.lang.reflect.Method method,
T mapping)
Register a handler method and its unique mapping.
|
void |
registerMapping(T mapping,
java.lang.Object handler,
java.lang.reflect.Method method)
Register the given mapping.
|
void |
setDetectHandlerMethodsInAncestorContexts(boolean detectHandlerMethodsInAncestorContexts)
Whether to detect handler methods in beans in ancestor ApplicationContexts.
|
void |
setHandlerMethodMappingNamingStrategy(HandlerMethodMappingNamingStrategy<T> namingStrategy)
Configure the naming strategy to use for assigning a default name to every
mapped handler method.
|
void |
unregisterMapping(T mapping)
Un-register the given mapping.
|
adaptInterceptor, detectMappedInterceptors, extendInterceptors, getAdaptedInterceptors, getCorsConfigurations, getCorsHandlerExecutionChain, getCorsProcessor, getDefaultHandler, getHandler, getHandlerExecutionChain, getMappedInterceptors, getOrder, getPathMatcher, getUrlPathHelper, initApplicationContext, initInterceptors, setAlwaysUseFullPath, setCorsConfigurations, setCorsProcessor, setDefaultHandler, setInterceptors, setOrder, setPathMatcher, setRemoveSemicolonContent, setUrlDecode, setUrlPathHelper
getServletContext, getTempDir, getWebApplicationContext, initApplicationContext, initServletContext, isContextRequired, setServletContext
getApplicationContext, getMessageSourceAccessor, requiredContextClass, setApplicationContext
private static final java.lang.String SCOPED_TARGET_NAME_PREFIX
We're not checking the autowire-candidate status here, which is how the
proxy target filtering problem is being handled at the autowiring level,
since autowire-candidate may have been turned to false
for other
reasons, while still expecting the bean to be eligible for handler methods.
Originally defined in ScopedProxyUtils
but duplicated here to avoid a hard dependency on the spring-aop module.
private static final HandlerMethod PREFLIGHT_AMBIGUOUS_MATCH
private static final CorsConfiguration ALLOW_CORS_CONFIG
private boolean detectHandlerMethodsInAncestorContexts
private HandlerMethodMappingNamingStrategy<T> namingStrategy
private final AbstractHandlerMethodMapping.MappingRegistry mappingRegistry
public void setDetectHandlerMethodsInAncestorContexts(boolean detectHandlerMethodsInAncestorContexts)
Default is "false": Only beans in the current ApplicationContext are considered, i.e. only in the context that this HandlerMapping itself is defined in (typically the current DispatcherServlet's context).
Switch this flag on to detect handler beans in ancestor contexts (typically the Spring root WebApplicationContext) as well.
public void setHandlerMethodMappingNamingStrategy(HandlerMethodMappingNamingStrategy<T> namingStrategy)
The default naming strategy is based on the capital letters of the class name followed by "#" and then the method name, e.g. "TC#getFoo" for a class named TestController with method getFoo.
public HandlerMethodMappingNamingStrategy<T> getNamingStrategy()
null
.public java.util.Map<T,HandlerMethod> getHandlerMethods()
public java.util.List<HandlerMethod> getHandlerMethodsForMappingName(java.lang.String mappingName)
mappingName
- the mapping namenull
; the returned
list will never be modified and is safe to iterate.setHandlerMethodMappingNamingStrategy(org.springframework.web.servlet.handler.HandlerMethodMappingNamingStrategy<T>)
AbstractHandlerMethodMapping.MappingRegistry getMappingRegistry()
public void registerMapping(T mapping, java.lang.Object handler, java.lang.reflect.Method method)
This method may be invoked at runtime after initialization has completed.
mapping
- the mapping for the handler methodhandler
- the handlermethod
- the methodpublic void unregisterMapping(T mapping)
This method may be invoked at runtime after initialization has completed.
mapping
- the mapping to unregisterpublic void afterPropertiesSet()
afterPropertiesSet
in interface InitializingBean
protected void initHandlerMethods()
protected void detectHandlerMethods(java.lang.Object handler)
handler
- the bean name of a handler or a handler instanceprotected void registerHandlerMethod(java.lang.Object handler, java.lang.reflect.Method method, T mapping)
handler
- the bean name of the handler or the handler instancemethod
- the method to registermapping
- the mapping conditions associated with the handler methodjava.lang.IllegalStateException
- if another method was already registered
under the same mappingprotected HandlerMethod createHandlerMethod(java.lang.Object handler, java.lang.reflect.Method method)
handler
- either a bean name or an actual handler instancemethod
- the target methodprotected CorsConfiguration initCorsConfiguration(java.lang.Object handler, java.lang.reflect.Method method, T mapping)
protected void handlerMethodsInitialized(java.util.Map<T,HandlerMethod> handlerMethods)
handlerMethods
- a read-only map with handler methods and mappings.protected HandlerMethod getHandlerInternal(HttpServletRequest request) throws java.lang.Exception
getHandlerInternal
in class AbstractHandlerMapping
request
- current HTTP requestnull
if none foundjava.lang.Exception
- if there is an internal errorprotected HandlerMethod lookupHandlerMethod(java.lang.String lookupPath, HttpServletRequest request) throws java.lang.Exception
lookupPath
- mapping lookup path within the current servlet mappingrequest
- the current requestnull
if no matchjava.lang.Exception
handleMatch(Object, String, HttpServletRequest)
,
handleNoMatch(Set, String, HttpServletRequest)
private void addMatchingMappings(java.util.Collection<T> mappings, java.util.List<AbstractHandlerMethodMapping.Match> matches, HttpServletRequest request)
protected void handleMatch(T mapping, java.lang.String lookupPath, HttpServletRequest request)
mapping
- the matching mappinglookupPath
- mapping lookup path within the current servlet mappingrequest
- the current requestprotected HandlerMethod handleNoMatch(java.util.Set<T> mappings, java.lang.String lookupPath, HttpServletRequest request) throws java.lang.Exception
mappings
- all registered mappingslookupPath
- mapping lookup path within the current servlet mappingrequest
- the current requestServletException
- in case of errorsjava.lang.Exception
protected CorsConfiguration getCorsConfiguration(java.lang.Object handler, HttpServletRequest request)
AbstractHandlerMapping
getCorsConfiguration
in class AbstractHandlerMapping
handler
- the handler to check (never null
).request
- the current request.null
if noneprotected abstract boolean isHandler(java.lang.Class<?> beanType)
beanType
- the type of the bean being checkedprotected abstract T getMappingForMethod(java.lang.reflect.Method method, java.lang.Class<?> handlerType)
method
- the method to provide a mapping forhandlerType
- the handler type, possibly a sub-type of the method's
declaring classnull
if the method is not mappedprotected abstract java.util.Set<java.lang.String> getMappingPathPatterns(T mapping)
protected abstract T getMatchingMapping(T mapping, HttpServletRequest request)
mapping
- the mapping to get a match forrequest
- the current HTTP servlet requestnull
if the mapping doesn't matchprotected abstract java.util.Comparator<T> getMappingComparator(HttpServletRequest request)
request
- the current requestnull
)