9494import org .springframework .messaging .handler .annotation .Headers ;
9595import org .springframework .messaging .handler .annotation .Payload ;
9696import org .springframework .messaging .handler .annotation .support .DefaultMessageHandlerMethodFactory ;
97+ import org .springframework .messaging .handler .annotation .support .MessageHandlerMethodFactory ;
9798import org .springframework .messaging .handler .invocation .HandlerMethodArgumentResolver ;
9899import org .springframework .messaging .handler .invocation .InvocableHandlerMethod ;
99100import org .springframework .messaging .handler .invocation .MethodArgumentResolutionException ;
@@ -167,7 +168,7 @@ public class MessagingMethodInvokerHelper<T> extends AbstractExpressionEvaluator
167168 SPEL_COMPILERS .put (SpelCompilerMode .MIXED , EXPRESSION_PARSER_MIXED );
168169 }
169170
170- private final DefaultMessageHandlerMethodFactory messageHandlerMethodFactory =
171+ private MessageHandlerMethodFactory messageHandlerMethodFactory =
171172 new DefaultMessageHandlerMethodFactory ();
172173
173174 private final Object targetObject ;
@@ -184,7 +185,7 @@ public class MessagingMethodInvokerHelper<T> extends AbstractExpressionEvaluator
184185
185186 private final List <Map <Class <?>, HandlerMethod >> handlerMethodsList ;
186187
187- private final HandlerMethod handlerMethod ;
188+ private HandlerMethod handlerMethod ;
188189
189190 private final TypeDescriptor expectedType ;
190191
@@ -257,16 +258,7 @@ private MessagingMethodInvokerHelper(Object targetObject, Class<? extends Annota
257258
258259 Assert .notNull (targetObject , "targetObject must not be null" );
259260 this .targetObject = targetObject ;
260- try {
261- InvocableHandlerMethod invocableHandlerMethod =
262- this .messageHandlerMethodFactory .createInvocableHandlerMethod (targetObject , method );
263- this .handlerMethod = new HandlerMethod (invocableHandlerMethod , canProcessMessageList );
264- this .defaultHandlerMethod = null ;
265- checkSpelInvokerRequired (getTargetClass (targetObject ), method , this .handlerMethod );
266- }
267- catch (IneligibleMethodException e ) {
268- throw new IllegalArgumentException (e );
269- }
261+ createHandlerMethod ();
270262 this .handlerMethods = null ;
271263 this .handlerMessageMethods = null ;
272264 this .handlerMethodsList = null ;
@@ -295,7 +287,8 @@ public void setUseSpelInvoker(boolean useSpelInvoker) {
295287 @ Override
296288 public void setBeanFactory (@ NonNull BeanFactory beanFactory ) {
297289 super .setBeanFactory (beanFactory );
298- this .messageHandlerMethodFactory .setBeanFactory (beanFactory );
290+ ((DefaultMessageHandlerMethodFactory ) this .messageHandlerMethodFactory ).setBeanFactory (beanFactory );
291+
299292 if (beanFactory instanceof ConfigurableListableBeanFactory ) {
300293 BeanExpressionResolver beanExpressionResolver = ((ConfigurableListableBeanFactory ) beanFactory )
301294 .getBeanExpressionResolver ();
@@ -310,7 +303,8 @@ public void setBeanFactory(@NonNull BeanFactory beanFactory) {
310303 public void setConversionService (ConversionService conversionService ) {
311304 super .setConversionService (conversionService );
312305 if (conversionService != null ) {
313- this .messageHandlerMethodFactory .setConversionService (conversionService );
306+ ((DefaultMessageHandlerMethodFactory ) this .messageHandlerMethodFactory )
307+ .setConversionService (conversionService );
314308 }
315309 }
316310
@@ -403,6 +397,25 @@ private MessagingMethodInvokerHelper(Object targetObject, Class<? extends Annota
403397 this .jsonObjectMapper = mapper ;
404398 }
405399
400+ private boolean isProvidedMessageHandlerFactoryBean () {
401+ BeanFactory beanFactory = getBeanFactory ();
402+ return beanFactory != null
403+ && beanFactory .containsBean (IntegrationContextUtils .MESSAGE_HANDLER_FACTORY_BEAN_NAME );
404+ }
405+
406+ private void createHandlerMethod () {
407+ try {
408+ InvocableHandlerMethod invocableHandlerMethod =
409+ this .messageHandlerMethodFactory .createInvocableHandlerMethod (this .targetObject , this .method );
410+ this .handlerMethod = new HandlerMethod (invocableHandlerMethod , this .canProcessMessageList );
411+ this .defaultHandlerMethod = null ;
412+ checkSpelInvokerRequired (getTargetClass (this .targetObject ), this .method , this .handlerMethod );
413+ }
414+ catch (IneligibleMethodException e ) {
415+ throw new IllegalArgumentException (e );
416+ }
417+ }
418+
406419 private void setDisplayString (Object targetObject , Object targetMethod ) {
407420 StringBuilder sb = new StringBuilder (targetObject .getClass ().getName ());
408421 if (targetMethod instanceof Method ) {
@@ -503,37 +516,51 @@ private void initializeHandler(HandlerMethod candidate) {
503516 candidate .initialized = true ;
504517 }
505518
519+ @ SuppressWarnings ("deprecation" )
506520 private synchronized void initialize () throws Exception {
507521 if (!this .initialized ) {
508522 BeanFactory beanFactory = getBeanFactory ();
509- if (beanFactory != null &&
510- beanFactory .containsBean (IntegrationContextUtils .ARGUMENT_RESOLVER_MESSAGE_CONVERTER_BEAN_NAME )) {
511-
512- try {
513- MessageConverter messageConverter =
514- beanFactory .getBean (IntegrationContextUtils .ARGUMENT_RESOLVER_MESSAGE_CONVERTER_BEAN_NAME ,
515- MessageConverter .class );
516-
517- this .messageHandlerMethodFactory .setMessageConverter (messageConverter );
518-
519- HandlerMethodArgumentResolversHolder handlerMethodArgumentResolversHolder =
520- beanFactory .getBean (this .canProcessMessageList
521- ? IntegrationContextUtils .LIST_ARGUMENT_RESOLVERS_BEAN_NAME
522- : IntegrationContextUtils .ARGUMENT_RESOLVERS_BEAN_NAME ,
523- HandlerMethodArgumentResolversHolder .class );
524-
525- this .messageHandlerMethodFactory .setCustomArgumentResolvers (
526- handlerMethodArgumentResolversHolder .getResolvers ());
523+ if (isProvidedMessageHandlerFactoryBean ()) {
524+ logger .info ("Overriding default instance of MessageHandlerMethodFactory with provided one." );
525+ this .messageHandlerMethodFactory =
526+ beanFactory .getBean (IntegrationContextUtils .MESSAGE_HANDLER_FACTORY_BEAN_NAME ,
527+ MessageHandlerMethodFactory .class );
528+ createHandlerMethod ();
529+ }
530+ else {
531+ if (beanFactory != null &&
532+ beanFactory .containsBean (
533+ IntegrationContextUtils .ARGUMENT_RESOLVER_MESSAGE_CONVERTER_BEAN_NAME )) {
534+
535+ try {
536+ MessageConverter messageConverter =
537+ beanFactory .getBean (
538+ IntegrationContextUtils .ARGUMENT_RESOLVER_MESSAGE_CONVERTER_BEAN_NAME ,
539+ MessageConverter .class );
540+
541+ ((DefaultMessageHandlerMethodFactory ) this .messageHandlerMethodFactory )
542+ .setMessageConverter (messageConverter );
543+
544+ HandlerMethodArgumentResolversHolder handlerMethodArgumentResolversHolder =
545+ beanFactory .getBean (this .canProcessMessageList
546+ ? IntegrationContextUtils .LIST_ARGUMENT_RESOLVERS_BEAN_NAME
547+ : IntegrationContextUtils .ARGUMENT_RESOLVERS_BEAN_NAME ,
548+ HandlerMethodArgumentResolversHolder .class );
549+
550+ ((DefaultMessageHandlerMethodFactory ) this .messageHandlerMethodFactory )
551+ .setCustomArgumentResolvers (
552+ handlerMethodArgumentResolversHolder .getResolvers ());
553+ }
554+ catch (NoSuchBeanDefinitionException e ) {
555+ configureLocalMessageHandlerFactory ();
556+ }
527557 }
528- catch ( NoSuchBeanDefinitionException e ) {
558+ else {
529559 configureLocalMessageHandlerFactory ();
530560 }
531- }
532- else {
533- configureLocalMessageHandlerFactory ();
561+ ((DefaultMessageHandlerMethodFactory ) this .messageHandlerMethodFactory ).afterPropertiesSet ();
534562 }
535563
536- this .messageHandlerMethodFactory .afterPropertiesSet ();
537564 prepareEvaluationContext ();
538565 this .initialized = true ;
539566 }
@@ -545,26 +572,27 @@ private synchronized void initialize() throws Exception {
545572 */
546573 private void configureLocalMessageHandlerFactory () {
547574 MessageConverter messageConverter = null ;
548- if (getBeanFactory () != null &&
549- getBeanFactory ()
550- .containsBean (IntegrationContextUtils .ARGUMENT_RESOLVER_MESSAGE_CONVERTER_BEAN_NAME )) {
551- messageConverter = getBeanFactory ()
552- .getBean (IntegrationContextUtils .ARGUMENT_RESOLVER_MESSAGE_CONVERTER_BEAN_NAME ,
553- MessageConverter .class );
554- this .messageHandlerMethodFactory .setMessageConverter (messageConverter );
575+ BeanFactory beanFactory = getBeanFactory ();
576+ if (beanFactory != null &&
577+ beanFactory .containsBean (IntegrationContextUtils .ARGUMENT_RESOLVER_MESSAGE_CONVERTER_BEAN_NAME )) {
578+ messageConverter = beanFactory
579+ .getBean (IntegrationContextUtils .ARGUMENT_RESOLVER_MESSAGE_CONVERTER_BEAN_NAME ,
580+ MessageConverter .class );
581+ ((DefaultMessageHandlerMethodFactory ) this .messageHandlerMethodFactory )
582+ .setMessageConverter (messageConverter );
555583 }
556584 else {
557585 messageConverter = new ConfigurableCompositeMessageConverter ();
558586 }
559587 NullAwarePayloadArgumentResolver nullResolver = new NullAwarePayloadArgumentResolver (messageConverter );
560588 PayloadExpressionArgumentResolver payloadExpressionArgumentResolver = new PayloadExpressionArgumentResolver ();
561- payloadExpressionArgumentResolver .setBeanFactory (getBeanFactory () );
589+ payloadExpressionArgumentResolver .setBeanFactory (beanFactory );
562590
563591 PayloadsArgumentResolver payloadsArgumentResolver = new PayloadsArgumentResolver ();
564- payloadsArgumentResolver .setBeanFactory (getBeanFactory () );
592+ payloadsArgumentResolver .setBeanFactory (beanFactory );
565593
566594 MapArgumentResolver mapArgumentResolver = new MapArgumentResolver ();
567- mapArgumentResolver .setBeanFactory (getBeanFactory () );
595+ mapArgumentResolver .setBeanFactory (beanFactory );
568596
569597 List <HandlerMethodArgumentResolver > customArgumentResolvers = new LinkedList <>();
570598 customArgumentResolvers .add (payloadExpressionArgumentResolver );
@@ -573,13 +601,14 @@ private void configureLocalMessageHandlerFactory() {
573601
574602 if (this .canProcessMessageList ) {
575603 CollectionArgumentResolver collectionArgumentResolver = new CollectionArgumentResolver (true );
576- collectionArgumentResolver .setBeanFactory (getBeanFactory () );
604+ collectionArgumentResolver .setBeanFactory (beanFactory );
577605 customArgumentResolvers .add (collectionArgumentResolver );
578606 }
579607
580608 customArgumentResolvers .add (mapArgumentResolver );
581609
582- this .messageHandlerMethodFactory .setCustomArgumentResolvers (customArgumentResolvers );
610+ ((DefaultMessageHandlerMethodFactory ) this .messageHandlerMethodFactory )
611+ .setCustomArgumentResolvers (customArgumentResolvers );
583612 }
584613
585614 @ SuppressWarnings ("unchecked" )
@@ -598,7 +627,8 @@ else if (e instanceof IllegalStateException) {
598627 if (!(e .getCause () instanceof IllegalArgumentException ) ||
599628 !e .getStackTrace ()[0 ].getClassName ().equals (InvocableHandlerMethod .class .getName ()) ||
600629 (!"argument type mismatch" .equals (e .getCause ().getMessage ()) &&
601- // JVM generates GeneratedMethodAccessor### after several calls with less error checking
630+ // JVM generates GeneratedMethodAccessor### after several calls with less error
631+ // checking
602632 !e .getCause ().getMessage ().startsWith ("java.lang.ClassCastException@" ))) {
603633 throw e ;
604634 }
@@ -1133,7 +1163,9 @@ private String generateExpression(Method method) {
11331163 }
11341164 if (annotationType .equals (Payloads .class )) {
11351165 Assert .isTrue (this .canProcessMessageList ,
1136- "The @Payloads annotation can only be applied if method handler canProcessMessageList." );
1166+ "The @Payloads annotation can only be applied if method handler " +
1167+ "canProcessMessageList" +
1168+ "." );
11371169 Assert .isTrue (Collection .class .isAssignableFrom (parameterType ),
11381170 "The @Payloads annotation can only be applied to a Collection-typed parameter." );
11391171 sb .append ("messages.![payload" );
0 commit comments