Class AbstractHandlerMethodMapping<T>

Type Parameters:
T - the mapping for a HandlerMethod containing the conditions needed to match the handler method to an incoming request.
All Implemented Interfaces:
Aware, BeanNameAware, InitializingBean, ApplicationContextAware, Ordered, HandlerMapping
Direct Known Subclasses:
RequestMappingInfoHandlerMapping

public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMapping implements InitializingBean
Abstract base class for 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>.

Since:
5.0
Author:
Rossen Stoyanchev, Brian Clozel, Sam Brannen
  • Constructor Details

    • AbstractHandlerMethodMapping

      public AbstractHandlerMethodMapping()
  • Method Details

    • getHandlerMethods

      public Map<T,HandlerMethod> getHandlerMethods()
      Return a (read-only) map with all mappings and HandlerMethod's.
    • registerMapping

      public void registerMapping(T mapping, Object handler, Method method)
      Register the given mapping.

      This method may be invoked at runtime after initialization has completed.

      Parameters:
      mapping - the mapping for the handler method
      handler - the handler
      method - the method
    • unregisterMapping

      public void unregisterMapping(T mapping)
      Un-register the given mapping.

      This method may be invoked at runtime after initialization has completed.

      Parameters:
      mapping - the mapping to unregister
    • afterPropertiesSet

      public void afterPropertiesSet()
      Detects handler methods at initialization.
      Specified by:
      afterPropertiesSet in interface InitializingBean
    • initHandlerMethods

      protected void initHandlerMethods()
      Scan beans in the ApplicationContext, detect and register handler methods.
      See Also:
    • detectHandlerMethods

      protected void detectHandlerMethods(Object handler)
      Look for handler methods in a handler.
      Parameters:
      handler - the bean name of a handler or a handler instance
    • registerHandlerMethod

      protected void registerHandlerMethod(Object handler, Method method, T mapping)
      Register a handler method and its unique mapping. Invoked at startup for each detected handler method.
      Parameters:
      handler - the bean name of the handler or the handler instance
      method - the method to register
      mapping - the mapping conditions associated with the handler method
      Throws:
      IllegalStateException - if another method was already registered under the same mapping
    • createHandlerMethod

      protected HandlerMethod createHandlerMethod(Object handler, Method method)
      Create the HandlerMethod instance.
      Parameters:
      handler - either a bean name or an actual handler instance
      method - the target method
      Returns:
      the created HandlerMethod
    • initCorsConfiguration

      @Nullable protected CorsConfiguration initCorsConfiguration(Object handler, Method method, T mapping)
      Extract and return the CORS configuration for the mapping.
    • handlerMethodsInitialized

      protected void handlerMethodsInitialized(Map<T,HandlerMethod> handlerMethods)
      Invoked after all handler methods have been detected.
      Parameters:
      handlerMethods - a read-only map with handler methods and mappings.
    • getHandlerInternal

      public reactor.core.publisher.Mono<HandlerMethod> getHandlerInternal(ServerWebExchange exchange)
      Look up a handler method for the given request.
      Specified by:
      getHandlerInternal in class AbstractHandlerMapping
      Parameters:
      exchange - the current exchange
      Returns:
      Mono for the matching handler, if any
    • lookupHandlerMethod

      @Nullable protected HandlerMethod lookupHandlerMethod(ServerWebExchange exchange) throws Exception
      Look up the best-matching handler method for the current request. If multiple matches are found, the best match is selected.
      Parameters:
      exchange - the current exchange
      Returns:
      the best-matching handler method, or null if no match
      Throws:
      Exception
      See Also:
    • handleMatch

      protected void handleMatch(T mapping, HandlerMethod handlerMethod, ServerWebExchange exchange)
      Invoked when a matching mapping is found.
      Parameters:
      mapping - the matching mapping
      handlerMethod - the matching method
      exchange - the current exchange
    • handleNoMatch

      @Nullable protected HandlerMethod handleNoMatch(Set<T> mappings, ServerWebExchange exchange) throws Exception
      Invoked when no matching mapping is not found.
      Parameters:
      mappings - all registered mappings
      exchange - the current exchange
      Returns:
      an alternative HandlerMethod or null
      Throws:
      Exception - provides details that can be translated into an error status code
    • hasCorsConfigurationSource

      protected boolean hasCorsConfigurationSource(Object handler)
      Description copied from class: AbstractHandlerMapping
      Return true if there is a CorsConfigurationSource for this handler.
      Overrides:
      hasCorsConfigurationSource in class AbstractHandlerMapping
    • getCorsConfiguration

      @Nullable protected CorsConfiguration getCorsConfiguration(Object handler, ServerWebExchange exchange)
      Description copied from class: AbstractHandlerMapping
      Retrieve the CORS configuration for the given handler.
      Overrides:
      getCorsConfiguration in class AbstractHandlerMapping
      Parameters:
      handler - the handler to check (never null)
      exchange - the current exchange
      Returns:
      the CORS configuration for the handler, or null if none
    • isHandler

      protected abstract boolean isHandler(Class<?> beanType)
      Whether the given type is a handler with handler methods.
      Parameters:
      beanType - the type of the bean being checked
      Returns:
      "true" if this a handler type, "false" otherwise.
    • getMappingForMethod

      @Nullable protected abstract T getMappingForMethod(Method method, Class<?> handlerType)
      Provide the mapping for a handler method. A method for which no mapping can be provided is not a handler method.
      Parameters:
      method - the method to provide a mapping for
      handlerType - the handler type, possibly a subtype of the method's declaring class
      Returns:
      the mapping, or null if the method is not mapped
    • getDirectPaths

      protected Set<String> getDirectPaths(T mapping)
      Return the request mapping paths that are not patterns.
      Since:
      5.3
    • getMatchingMapping

      @Nullable protected abstract T getMatchingMapping(T mapping, ServerWebExchange exchange)
      Check if a mapping matches the current request and return a (potentially new) mapping with conditions relevant to the current request.
      Parameters:
      mapping - the mapping to get a match for
      exchange - the current exchange
      Returns:
      the match, or null if the mapping doesn't match
    • getMappingComparator

      protected abstract Comparator<T> getMappingComparator(ServerWebExchange exchange)
      Return a comparator for sorting matching mappings. The returned comparator should sort 'better' matches higher.
      Parameters:
      exchange - the current exchange
      Returns:
      the comparator (never null)