Class SimpAnnotationMethodMessageHandler
- java.lang.Object
- org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler<SimpMessageMappingInfo>
- org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler
- All Implemented Interfaces:
Aware,InitializingBean,ApplicationContextAware,EmbeddedValueResolverAware,Lifecycle,Phased,SmartLifecycle,MessageHandler
- Direct Known Subclasses:
WebSocketAnnotationMethodMessageHandler
public class SimpAnnotationMethodMessageHandler extends AbstractMethodMessageHandler<SimpMessageMappingInfo> implements EmbeddedValueResolverAware, SmartLifecycle
A handler for messages delegating to@MessageMappingand@SubscribeMappingannotated methods.Supports Ant-style path patterns with template variables.
- Since:
- 4.0
- Author:
- Rossen Stoyanchev, Brian Clozel, Juergen Hoeller
Field Summary
Fields inherited from class org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler
logger
Constructor Summary
Constructors Constructor Description SimpAnnotationMethodMessageHandler(SubscribableChannel clientInboundChannel, MessageChannel clientOutboundChannel, SimpMessageSendingOperations brokerTemplate)Create an instance of SimpAnnotationMethodMessageHandler with the given message channels and broker messaging template.
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected AbstractExceptionHandlerMethodResolvercreateExceptionHandlerMethodResolverFor(Class<?> beanType)ConversionServicegetConversionService()Return the configuredConversionService.protected StringgetDestination(Message<?> message)protected Set<String>getDirectLookupDestinations(SimpMessageMappingInfo mapping)Return destinations contained in the mapping that are not patterns and are therefore suitable for direct lookups.MessageHeaderInitializergetHeaderInitializer()Return the configured header initializer.protected StringgetLookupDestination(String destination)Check whether the given destination (of an incoming message) matches to one of the configured destination prefixes and if so return the remaining portion of the destination after the matched prefix.protected Comparator<SimpMessageMappingInfo>getMappingComparator(Message<?> message)Return a comparator for sorting matching mappings.protected SimpMessageMappingInfogetMappingForMethod(Method method, Class<?> handlerType)Provide the mapping for a handler method.protected SimpMessageMappingInfogetMatchingMapping(SimpMessageMappingInfo mapping, Message<?> message)Check if a mapping matches the current message and return a possibly new mapping with conditions relevant to the current request.MessageConvertergetMessageConverter()Return the configuredMessageConverter.PathMatchergetPathMatcher()Return the PathMatcher implementation to use for matching destinations.intgetPhase()Return the phase value of this object.ValidatorgetValidator()Return the configured Validator instance.protected voidhandleMatch(SimpMessageMappingInfo mapping, HandlerMethod handlerMethod, String lookupDestination, Message<?> message)protected List<HandlerMethodArgumentResolver>initArgumentResolvers()Return the list of argument resolvers to use.protected List<? extends HandlerMethodReturnValueHandler>initReturnValueHandlers()Return the list of return value handlers to use.booleanisAutoStartup()Returnstrueif thisLifecyclecomponent should get started automatically by the container at the time that the containingApplicationContextgets refreshed.protected booleanisHandler(Class<?> beanType)Whether the given bean type should be introspected for messaging handling methods.booleanisRunning()Check whether this component is currently running.protected String[]resolveEmbeddedValuesInDestinations(String[] destinations)Resolve placeholder values in the given array of destinations.voidsetConversionService(ConversionService conversionService)Configure aConversionServiceto use when resolving method arguments, for example message header values.voidsetDestinationPrefixes(Collection<String> prefixes)When this property is configured only messages to destinations matching one of the configured prefixes are eligible for handling.voidsetEmbeddedValueResolver(StringValueResolver resolver)Set the StringValueResolver to use for resolving embedded definition values.voidsetHeaderInitializer(MessageHeaderInitializer headerInitializer)Configure aMessageHeaderInitializerto pass on toHandlerMethodReturnValueHandlers that send messages from controller return values.voidsetMessageConverter(MessageConverter converter)Configure aMessageConverterto use to convert the payload of a message from its serialized form with a specific MIME type to an Object matching the target method parameter.voidsetPathMatcher(PathMatcher pathMatcher)Set the PathMatcher implementation to use for matching destinations against configured destination patterns.voidsetValidator(Validator validator)Set the Validator instance used for validating@Payloadarguments.voidstart()Start this component.voidstop()Stop this component, typically in a synchronous fashion, such that the component is fully stopped upon return of this method.voidstop(Runnable callback)Indicates that a Lifecycle component must stop if it is currently running.Methods inherited from class org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler
afterPropertiesSet, createHandlerMethod, detectHandlerMethods, getApplicationContext, getArgumentResolvers, getCustomArgumentResolvers, getCustomReturnValueHandlers, getDestinationPrefixes, getExceptionHandlerMethod, getHandlerMethods, getReturnValueHandlers, handleMessage, handleMessageInternal, handleNoMatch, processHandlerMethodException, registerExceptionHandlerAdvice, registerHandlerMethod, setApplicationContext, setArgumentResolvers, setCustomArgumentResolvers, setCustomReturnValueHandlers, setReturnValueHandlers, toString
Constructor Detail
SimpAnnotationMethodMessageHandler
public SimpAnnotationMethodMessageHandler(SubscribableChannel clientInboundChannel, MessageChannel clientOutboundChannel, SimpMessageSendingOperations brokerTemplate)
Create an instance of SimpAnnotationMethodMessageHandler with the given message channels and broker messaging template.- Parameters:
clientInboundChannel- the channel for receiving messages from clients (e.g. WebSocket clients)clientOutboundChannel- the channel for messages to clients (e.g. WebSocket clients)brokerTemplate- a messaging template to send application messages to the broker
Method Detail
setDestinationPrefixes
public void setDestinationPrefixes(Collection<String> prefixes)
When this property is configured only messages to destinations matching one of the configured prefixes are eligible for handling. When there is a match the prefix is removed and only the remaining part of the destination is used for method-mapping purposes.By default, no prefixes are configured in which case all messages are eligible for handling.
Destination prefixes are expected to be slash-separated Strings and therefore a slash is automatically appended where missing to ensure a proper prefix-based match (i.e. matching complete segments).
Note however that the remaining portion of a destination after the prefix may use a different separator (e.g. commonly "." in messaging) depending on the configured
PathMatcher.- Overrides:
setDestinationPrefixesin classAbstractMethodMessageHandler<SimpMessageMappingInfo>
setMessageConverter
public void setMessageConverter(MessageConverter converter)
Configure aMessageConverterto use to convert the payload of a message from its serialized form with a specific MIME type to an Object matching the target method parameter. The converter is also used when sending a message to the message broker.- See Also:
CompositeMessageConverter
getMessageConverter
public MessageConverter getMessageConverter()
Return the configuredMessageConverter.
setConversionService
public void setConversionService(ConversionService conversionService)
Configure aConversionServiceto use when resolving method arguments, for example message header values.By default,
DefaultFormattingConversionServiceis used.
getConversionService
public ConversionService getConversionService()
Return the configuredConversionService.
setPathMatcher
public void setPathMatcher(PathMatcher pathMatcher)
Set the PathMatcher implementation to use for matching destinations against configured destination patterns.By default,
AntPathMatcheris used.
getPathMatcher
public PathMatcher getPathMatcher()
Return the PathMatcher implementation to use for matching destinations.
getValidator
public Validator getValidator()
Return the configured Validator instance.
setValidator
public void setValidator(Validator validator)
Set the Validator instance used for validating@Payloadarguments.- See Also:
Validated,PayloadArgumentResolver
setEmbeddedValueResolver
public void setEmbeddedValueResolver(StringValueResolver resolver)
Description copied from interface:EmbeddedValueResolverAwareSet the StringValueResolver to use for resolving embedded definition values.- Specified by:
setEmbeddedValueResolverin interfaceEmbeddedValueResolverAware
setHeaderInitializer
public void setHeaderInitializer(MessageHeaderInitializer headerInitializer)
Configure aMessageHeaderInitializerto pass on toHandlerMethodReturnValueHandlers that send messages from controller return values.By default, this property is not set.
getHeaderInitializer
public MessageHeaderInitializer getHeaderInitializer()
Return the configured header initializer.
isAutoStartup
public boolean isAutoStartup()
Description copied from interface:SmartLifecycleReturnstrueif thisLifecyclecomponent should get started automatically by the container at the time that the containingApplicationContextgets refreshed.A value of
falseindicates that the component is intended to be started through an explicitLifecycle.start()call instead, analogous to a plainLifecycleimplementation.- Specified by:
isAutoStartupin interfaceSmartLifecycle- See Also:
Lifecycle.start(),Phased.getPhase(),LifecycleProcessor.onRefresh(),ConfigurableApplicationContext.refresh()
getPhase
public int getPhase()
Description copied from interface:PhasedReturn the phase value of this object.
start
public final void start()
Description copied from interface:LifecycleStart this component.Should not throw an exception if the component is already running.
In the case of a container, this will propagate the start signal to all components that apply.
- Specified by:
startin interfaceLifecycle- See Also:
SmartLifecycle.isAutoStartup()
stop
public final void stop()
Description copied from interface:LifecycleStop this component, typically in a synchronous fashion, such that the component is fully stopped upon return of this method. Consider implementingSmartLifecycleand itsstop(Runnable)variant when asynchronous stop behavior is necessary.Note that this stop notification is not guaranteed to come before destruction: On regular shutdown,
Lifecyclebeans will first receive a stop notification before the general destruction callbacks are being propagated; however, on hot refresh during a context's lifetime or on aborted refresh attempts, a given bean's destroy method will be called without any consideration of stop signals upfront.Should not throw an exception if the component is not running (not started yet).
In the case of a container, this will propagate the stop signal to all components that apply.
- Specified by:
stopin interfaceLifecycle- See Also:
SmartLifecycle.stop(Runnable),DisposableBean.destroy()
stop
public final void stop(Runnable callback)
Description copied from interface:SmartLifecycleIndicates that a Lifecycle component must stop if it is currently running.The provided callback is used by the
LifecycleProcessorto support an ordered, and potentially concurrent, shutdown of all components having a common shutdown order value. The callback must be executed after theSmartLifecyclecomponent does indeed stop.The
LifecycleProcessorwill call only this variant of thestopmethod; i.e.Lifecycle.stop()will not be called forSmartLifecycleimplementations unless explicitly delegated to within the implementation of this method.- Specified by:
stopin interfaceSmartLifecycle- See Also:
Lifecycle.stop(),Phased.getPhase()
isRunning
public final boolean isRunning()
Description copied from interface:LifecycleCheck whether this component is currently running.In the case of a container, this will return
trueonly if all components that apply are currently running.
initArgumentResolvers
protected List<HandlerMethodArgumentResolver> initArgumentResolvers()
Description copied from class:AbstractMethodMessageHandlerReturn the list of argument resolvers to use. Invoked only if the resolvers have not already been set viaAbstractMethodMessageHandler.setArgumentResolvers(java.util.List<org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver>).Subclasses should also take into account custom argument types configured via
AbstractMethodMessageHandler.setCustomArgumentResolvers(java.util.List<org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver>).- Specified by:
initArgumentResolversin classAbstractMethodMessageHandler<SimpMessageMappingInfo>
initReturnValueHandlers
protected List<? extends HandlerMethodReturnValueHandler> initReturnValueHandlers()
Description copied from class:AbstractMethodMessageHandlerReturn the list of return value handlers to use. Invoked only if the return value handlers have not already been set viaAbstractMethodMessageHandler.setReturnValueHandlers(java.util.List<org.springframework.messaging.handler.invocation.HandlerMethodReturnValueHandler>).Subclasses should also take into account custom return value types configured via
AbstractMethodMessageHandler.setCustomReturnValueHandlers(java.util.List<org.springframework.messaging.handler.invocation.HandlerMethodReturnValueHandler>).- Specified by:
initReturnValueHandlersin classAbstractMethodMessageHandler<SimpMessageMappingInfo>
isHandler
protected boolean isHandler(Class<?> beanType)
Description copied from class:AbstractMethodMessageHandlerWhether the given bean type should be introspected for messaging handling methods.- Specified by:
isHandlerin classAbstractMethodMessageHandler<SimpMessageMappingInfo>
getMappingForMethod
protected SimpMessageMappingInfo getMappingForMethod(Method method, Class<?> handlerType)
Description copied from class:AbstractMethodMessageHandlerProvide the mapping for a handler method.- Specified by:
getMappingForMethodin classAbstractMethodMessageHandler<SimpMessageMappingInfo>- Parameters:
method- the method to provide a mapping forhandlerType- the handler type, possibly a sub-type of the method's declaring class- Returns:
- the mapping, or
nullif the method is not mapped
resolveEmbeddedValuesInDestinations
protected String[] resolveEmbeddedValuesInDestinations(String[] destinations)
Resolve placeholder values in the given array of destinations.- Returns:
- a new array with updated destinations
- Since:
- 4.2
getDirectLookupDestinations
protected Set<String> getDirectLookupDestinations(SimpMessageMappingInfo mapping)
Description copied from class:AbstractMethodMessageHandlerReturn destinations contained in the mapping that are not patterns and are therefore suitable for direct lookups.- Specified by:
getDirectLookupDestinationsin classAbstractMethodMessageHandler<SimpMessageMappingInfo>
getDestination
protected String getDestination(Message<?> message)
- Specified by:
getDestinationin classAbstractMethodMessageHandler<SimpMessageMappingInfo>
getLookupDestination
protected String getLookupDestination(String destination)
Description copied from class:AbstractMethodMessageHandlerCheck whether the given destination (of an incoming message) matches to one of the configured destination prefixes and if so return the remaining portion of the destination after the matched prefix.If there are no matching prefixes, return
null.If there are no destination prefixes, return the destination as is.
- Overrides:
getLookupDestinationin classAbstractMethodMessageHandler<SimpMessageMappingInfo>
getMatchingMapping
protected SimpMessageMappingInfo getMatchingMapping(SimpMessageMappingInfo mapping, Message<?> message)
Description copied from class:AbstractMethodMessageHandlerCheck if a mapping matches the current message and return a possibly new mapping with conditions relevant to the current request.- Specified by:
getMatchingMappingin classAbstractMethodMessageHandler<SimpMessageMappingInfo>- Parameters:
mapping- the mapping to get a match formessage- the message being handled- Returns:
- the match or
nullif there is no match
getMappingComparator
protected Comparator<SimpMessageMappingInfo> getMappingComparator(Message<?> message)
Description copied from class:AbstractMethodMessageHandlerReturn a comparator for sorting matching mappings. The returned comparator should sort 'better' matches higher.- Specified by:
getMappingComparatorin classAbstractMethodMessageHandler<SimpMessageMappingInfo>- Parameters:
message- the current Message- Returns:
- the comparator, never
null
handleMatch
protected void handleMatch(SimpMessageMappingInfo mapping, HandlerMethod handlerMethod, String lookupDestination, Message<?> message)
- Overrides:
handleMatchin classAbstractMethodMessageHandler<SimpMessageMappingInfo>
createExceptionHandlerMethodResolverFor
protected AbstractExceptionHandlerMethodResolver createExceptionHandlerMethodResolverFor(Class<?> beanType)
- Specified by:
createExceptionHandlerMethodResolverForin classAbstractMethodMessageHandler<SimpMessageMappingInfo>