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 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 boolean |
detectHandlerMethodsInAncestorContexts |
private java.util.Map<T,HandlerMethod> |
handlerMethods |
private MultiValueMap<java.lang.String,HandlerMethod> |
nameMap |
private HandlerMethodMappingNamingStrategy<T> |
namingStrategy |
private static java.lang.String |
SCOPED_TARGET_NAME_PREFIX
Bean name prefix for target beans behind scoped proxies.
|
private MultiValueMap<java.lang.String,T> |
urlMap |
logger
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 HandlerMethod |
getHandlerInternal(HttpServletRequest request)
Look up a handler method for the given request.
|
java.util.Map<T,HandlerMethod> |
getHandlerMethods()
Return a map with all handler methods and their mappings.
|
java.util.List<HandlerMethod> |
getHandlerMethodsForMappingName(java.lang.String mappingName)
Return the handler methods mapped to the mapping with the given 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.
|
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.
|
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 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 |
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.
|
private void |
updateNameMap(java.lang.String name,
HandlerMethod newHandlerMethod) |
adaptInterceptor, detectMappedInterceptors, extendInterceptors, getAdaptedInterceptors, getDefaultHandler, getHandler, getHandlerExecutionChain, getMappedInterceptors, getOrder, getPathMatcher, getUrlPathHelper, initApplicationContext, initInterceptors, setAlwaysUseFullPath, 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 boolean detectHandlerMethodsInAncestorContexts
private HandlerMethodMappingNamingStrategy<T> namingStrategy
private final java.util.Map<T,HandlerMethod> handlerMethods
private final MultiValueMap<java.lang.String,T> urlMap
private final MultiValueMap<java.lang.String,HandlerMethod> nameMap
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)
public java.util.Map<T,HandlerMethod> getHandlerMethods()
public java.util.List<HandlerMethod> getHandlerMethodsForMappingName(java.lang.String mappingName)
mappingName
- the mapping namepublic void afterPropertiesSet()
afterPropertiesSet
in interface InitializingBean
protected void initHandlerMethods()
protected abstract boolean isHandler(java.lang.Class<?> beanType)
beanType
- the type of the bean being checkedprotected void detectHandlerMethods(java.lang.Object handler)
handler
- the bean name of a handler or a handler instanceprotected 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 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 mappingprivate void updateNameMap(java.lang.String name, HandlerMethod newHandlerMethod)
protected HandlerMethod createHandlerMethod(java.lang.Object handler, java.lang.reflect.Method method)
handler
- either a bean name or an actual handler instancemethod
- the target methodprotected abstract java.util.Set<java.lang.String> getMappingPathPatterns(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 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
)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