Class MessageMappingMessageHandler
- All Implemented Interfaces:
Aware
,BeanNameAware
,InitializingBean
,ApplicationContextAware
,EmbeddedValueResolverAware
,ReactiveMessageHandler
- Direct Known Subclasses:
RSocketMessageHandler
AbstractMethodMessageHandler
for reactive, non-blocking
handling of messages via @MessageMapping
methods.
By default, such methods are detected in @Controller
Spring beans but
that can be changed via AbstractMethodMessageHandler.setHandlerPredicate(Predicate)
.
Payloads for incoming messages are decoded through the configured
setDecoders(List)
decoders, with the help of
PayloadMethodArgumentResolver
.
There is no default handling for return values but
AbstractMethodMessageHandler.setReturnValueHandlerConfigurer(org.springframework.messaging.handler.invocation.reactive.ReturnValueHandlerConfigurer)
can be used to configure custom
return value handlers. Subclasses may also override
initReturnValueHandlers()
to set up default return value handlers.
- Since:
- 5.2
- Author:
- Rossen Stoyanchev
- See Also:
-
Field Summary
Fields inherited from class org.springframework.messaging.handler.invocation.reactive.AbstractMethodMessageHandler
logger
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionvoid
Invoked by the containingBeanFactory
after it has set all bean properties and satisfiedBeanFactoryAware
,ApplicationContextAware
etc.protected AbstractExceptionHandlerMethodResolver
createExceptionMethodResolverFor
(Class<?> beanType) Create a concrete instance ofAbstractExceptionHandlerMethodResolver
that finds exception handling methods based on some criteria, for example, based on the presence of@MessageExceptionHandler
.protected CompositeMessageCondition
getCondition
(AnnotatedElement element) Determine the mapping condition for the given annotated element.Return the configured ConversionService.Return the configured decoders.protected RouteMatcher.Route
getDestination
(Message<?> message) Extract the destination from the given message.Return String-based destinations for the given mapping, if any, that can be used to find matches with a direct lookup (i.e.protected Comparator<CompositeMessageCondition>
getMappingComparator
(Message<?> message) Return a comparator for sorting matching mappings.protected CompositeMessageCondition
getMappingForMethod
(Method method, Class<?> handlerType) Obtain the mapping for the given method, if any.protected CompositeMessageCondition
getMatchingMapping
(CompositeMessageCondition mapping, Message<?> message) Check if a mapping matches the current message and return a possibly new mapping with conditions relevant to the current request.Return theRouteMatcher
used to map messages to handlers.Return the configured Validator instance.protected reactor.core.publisher.Mono<Void>
handleMatch
(CompositeMessageCondition mapping, HandlerMethod handlerMethod, Message<?> message) protected List<? extends HandlerMethodArgumentResolver>
Return the list of argument resolvers to use.protected List<? extends HandlerMethodReturnValueHandler>
Return the list of return value handlers to use.protected RouteMatcher
Obtain theRouteMatcher
for actual use.protected String[]
processDestinations
(String[] destinations) Resolve placeholders in the given destinations.void
Use this method to register aMessagingAdviceBean
that may contain globally applicable@MessageExceptionHandler
methods.void
setConversionService
(ConversionService conversionService) Configure aConversionService
to use for type conversion of String based values, for example, in destination variables or headers.void
setDecoders
(List<? extends Decoder<?>> decoders) Configure the decoders to use for incoming payloads.void
setEmbeddedValueResolver
(StringValueResolver resolver) Set the StringValueResolver to use for resolving embedded definition values.void
setRouteMatcher
(RouteMatcher routeMatcher) Set theRouteMatcher
to use for mapping messages to handlers based on the route patterns they're configured with.void
setValidator
(Validator validator) Set the Validator instance used for validating@Payload
arguments.Methods inherited from class org.springframework.messaging.handler.invocation.reactive.AbstractMethodMessageHandler
detectHandlerMethods, extendMapping, getApplicationContext, getArgumentResolverConfigurer, getArgumentResolvers, getBeanName, getDestinationLookup, getHandlerMethods, getHandlerPredicate, getReactiveAdapterRegistry, getReturnValueHandlerConfigurer, handleMessage, handleNoMatch, registerExceptionHandlerAdvice, registerHandlerMethod, setApplicationContext, setArgumentResolverConfigurer, setBeanName, setHandlerPredicate, setHandlers, setReactiveAdapterRegistry, setReturnValueHandlerConfigurer
-
Constructor Details
-
MessageMappingMessageHandler
public MessageMappingMessageHandler()
-
-
Method Details
-
setDecoders
Configure the decoders to use for incoming payloads. -
getDecoders
Return the configured decoders. -
setValidator
Set the Validator instance used for validating@Payload
arguments.- See Also:
-
getValidator
Return the configured Validator instance. -
setRouteMatcher
Set theRouteMatcher
to use for mapping messages to handlers based on the route patterns they're configured with.By default,
SimpleRouteMatcher
is used, backed byAntPathMatcher
with "." as separator. For greater efficiency consider using thePathPatternRouteMatcher
fromspring-web
instead. -
getRouteMatcher
Return theRouteMatcher
used to map messages to handlers. May benull
before the component is initialized. -
obtainRouteMatcher
Obtain theRouteMatcher
for actual use.- Returns:
- the RouteMatcher (never
null
) - Throws:
IllegalStateException
- in case of no RouteMatcher set- Since:
- 5.0
-
setConversionService
Configure aConversionService
to use for type conversion of String based values, for example, in destination variables or headers.By default
DefaultFormattingConversionService
is used.- Parameters:
conversionService
- the conversion service to use
-
getConversionService
Return the configured ConversionService. -
setEmbeddedValueResolver
Description copied from interface:EmbeddedValueResolverAware
Set the StringValueResolver to use for resolving embedded definition values.- Specified by:
setEmbeddedValueResolver
in interfaceEmbeddedValueResolverAware
-
registerMessagingAdvice
Use this method to register aMessagingAdviceBean
that may contain globally applicable@MessageExceptionHandler
methods.Note: spring-messaging does not depend on spring-web and therefore it is not possible to explicitly support the registration of a
@ControllerAdvice
bean. You can use the following adapter code to register@ControllerAdvice
beans here:ControllerAdviceBean.findAnnotatedBeans(context).forEach(bean -> messageHandler.registerMessagingAdvice(new ControllerAdviceWrapper(bean)); public class ControllerAdviceWrapper implements MessagingAdviceBean { private final ControllerAdviceBean delegate; // delegate all methods }
- Parameters:
bean
- the bean to check for@MessageExceptionHandler
methods- Since:
- 5.3.5
-
afterPropertiesSet
public void afterPropertiesSet()Description copied from interface:InitializingBean
Invoked by the containingBeanFactory
after it has set all bean properties and satisfiedBeanFactoryAware
,ApplicationContextAware
etc.This method allows the bean instance to perform validation of its overall configuration and final initialization when all bean properties have been set.
- Specified by:
afterPropertiesSet
in interfaceInitializingBean
- Overrides:
afterPropertiesSet
in classAbstractMethodMessageHandler<CompositeMessageCondition>
-
initArgumentResolvers
Description copied from class:AbstractMethodMessageHandler
Return the list of argument resolvers to use.Subclasses should also take into account custom argument types configured via
AbstractMethodMessageHandler.setArgumentResolverConfigurer(org.springframework.messaging.handler.invocation.reactive.ArgumentResolverConfigurer)
.- Specified by:
initArgumentResolvers
in classAbstractMethodMessageHandler<CompositeMessageCondition>
-
initReturnValueHandlers
Description copied from class:AbstractMethodMessageHandler
Return the list of return value handlers to use.Subclasses should also take into account custom return value types configured via
AbstractMethodMessageHandler.setReturnValueHandlerConfigurer(org.springframework.messaging.handler.invocation.reactive.ReturnValueHandlerConfigurer)
.- Specified by:
initReturnValueHandlers
in classAbstractMethodMessageHandler<CompositeMessageCondition>
-
getMappingForMethod
@Nullable protected CompositeMessageCondition getMappingForMethod(Method method, Class<?> handlerType) Description copied from class:AbstractMethodMessageHandler
Obtain the mapping for the given method, if any.- Specified by:
getMappingForMethod
in classAbstractMethodMessageHandler<CompositeMessageCondition>
- Parameters:
method
- the method to checkhandlerType
- the handler type, possibly a subtype of the method's declaring class- Returns:
- the mapping, or
null
if the method is not mapped
-
getCondition
Determine the mapping condition for the given annotated element.- Parameters:
element
- the element to check- Returns:
- the condition, or
null
-
processDestinations
Resolve placeholders in the given destinations.- Parameters:
destinations
- the destinations- Returns:
- new array with the processed destinations or the same array
-
getDirectLookupMappings
Description copied from class:AbstractMethodMessageHandler
Return String-based destinations for the given mapping, if any, that can be used to find matches with a direct lookup (i.e. non-patterns).Note: This is completely optional. The mapping metadata for a subclass may support neither direct lookups, nor String based destinations.
- Specified by:
getDirectLookupMappings
in classAbstractMethodMessageHandler<CompositeMessageCondition>
-
getDestination
Description copied from class:AbstractMethodMessageHandler
Extract the destination from the given message.- Specified by:
getDestination
in classAbstractMethodMessageHandler<CompositeMessageCondition>
- See Also:
-
getMatchingMapping
@Nullable protected CompositeMessageCondition getMatchingMapping(CompositeMessageCondition mapping, Message<?> message) Description copied from class:AbstractMethodMessageHandler
Check if a mapping matches the current message and return a possibly new mapping with conditions relevant to the current request.- Specified by:
getMatchingMapping
in classAbstractMethodMessageHandler<CompositeMessageCondition>
- Parameters:
mapping
- the mapping to get a match formessage
- the message being handled- Returns:
- the match or
null
if there is no match
-
getMappingComparator
Description copied from class:AbstractMethodMessageHandler
Return a comparator for sorting matching mappings. The returned comparator should sort 'better' matches higher.- Specified by:
getMappingComparator
in classAbstractMethodMessageHandler<CompositeMessageCondition>
- Parameters:
message
- the current Message- Returns:
- the comparator, never
null
-
createExceptionMethodResolverFor
protected AbstractExceptionHandlerMethodResolver createExceptionMethodResolverFor(Class<?> beanType) Description copied from class:AbstractMethodMessageHandler
Create a concrete instance ofAbstractExceptionHandlerMethodResolver
that finds exception handling methods based on some criteria, for example, based on the presence of@MessageExceptionHandler
.- Specified by:
createExceptionMethodResolverFor
in classAbstractMethodMessageHandler<CompositeMessageCondition>
- Parameters:
beanType
- the class in which an exception occurred during handling- Returns:
- the resolver to use
-
handleMatch
protected reactor.core.publisher.Mono<Void> handleMatch(CompositeMessageCondition mapping, HandlerMethod handlerMethod, Message<?> message) - Overrides:
handleMatch
in classAbstractMethodMessageHandler<CompositeMessageCondition>
-