94
94
import org .springframework .messaging .handler .annotation .Headers ;
95
95
import org .springframework .messaging .handler .annotation .Payload ;
96
96
import org .springframework .messaging .handler .annotation .support .DefaultMessageHandlerMethodFactory ;
97
+ import org .springframework .messaging .handler .annotation .support .MessageHandlerMethodFactory ;
97
98
import org .springframework .messaging .handler .invocation .HandlerMethodArgumentResolver ;
98
99
import org .springframework .messaging .handler .invocation .InvocableHandlerMethod ;
99
100
import org .springframework .messaging .handler .invocation .MethodArgumentResolutionException ;
@@ -167,7 +168,7 @@ public class MessagingMethodInvokerHelper<T> extends AbstractExpressionEvaluator
167
168
SPEL_COMPILERS .put (SpelCompilerMode .MIXED , EXPRESSION_PARSER_MIXED );
168
169
}
169
170
170
- private final DefaultMessageHandlerMethodFactory messageHandlerMethodFactory =
171
+ private MessageHandlerMethodFactory messageHandlerMethodFactory =
171
172
new DefaultMessageHandlerMethodFactory ();
172
173
173
174
private final Object targetObject ;
@@ -184,7 +185,7 @@ public class MessagingMethodInvokerHelper<T> extends AbstractExpressionEvaluator
184
185
185
186
private final List <Map <Class <?>, HandlerMethod >> handlerMethodsList ;
186
187
187
- private final HandlerMethod handlerMethod ;
188
+ private HandlerMethod handlerMethod ;
188
189
189
190
private final TypeDescriptor expectedType ;
190
191
@@ -257,16 +258,7 @@ private MessagingMethodInvokerHelper(Object targetObject, Class<? extends Annota
257
258
258
259
Assert .notNull (targetObject , "targetObject must not be null" );
259
260
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 ();
270
262
this .handlerMethods = null ;
271
263
this .handlerMessageMethods = null ;
272
264
this .handlerMethodsList = null ;
@@ -295,7 +287,8 @@ public void setUseSpelInvoker(boolean useSpelInvoker) {
295
287
@ Override
296
288
public void setBeanFactory (@ NonNull BeanFactory beanFactory ) {
297
289
super .setBeanFactory (beanFactory );
298
- this .messageHandlerMethodFactory .setBeanFactory (beanFactory );
290
+ ((DefaultMessageHandlerMethodFactory ) this .messageHandlerMethodFactory ).setBeanFactory (beanFactory );
291
+
299
292
if (beanFactory instanceof ConfigurableListableBeanFactory ) {
300
293
BeanExpressionResolver beanExpressionResolver = ((ConfigurableListableBeanFactory ) beanFactory )
301
294
.getBeanExpressionResolver ();
@@ -310,7 +303,8 @@ public void setBeanFactory(@NonNull BeanFactory beanFactory) {
310
303
public void setConversionService (ConversionService conversionService ) {
311
304
super .setConversionService (conversionService );
312
305
if (conversionService != null ) {
313
- this .messageHandlerMethodFactory .setConversionService (conversionService );
306
+ ((DefaultMessageHandlerMethodFactory ) this .messageHandlerMethodFactory )
307
+ .setConversionService (conversionService );
314
308
}
315
309
}
316
310
@@ -403,6 +397,25 @@ private MessagingMethodInvokerHelper(Object targetObject, Class<? extends Annota
403
397
this .jsonObjectMapper = mapper ;
404
398
}
405
399
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
+
406
419
private void setDisplayString (Object targetObject , Object targetMethod ) {
407
420
StringBuilder sb = new StringBuilder (targetObject .getClass ().getName ());
408
421
if (targetMethod instanceof Method ) {
@@ -503,37 +516,51 @@ private void initializeHandler(HandlerMethod candidate) {
503
516
candidate .initialized = true ;
504
517
}
505
518
519
+ @ SuppressWarnings ("deprecation" )
506
520
private synchronized void initialize () throws Exception {
507
521
if (!this .initialized ) {
508
522
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
+ }
527
557
}
528
- catch ( NoSuchBeanDefinitionException e ) {
558
+ else {
529
559
configureLocalMessageHandlerFactory ();
530
560
}
531
- }
532
- else {
533
- configureLocalMessageHandlerFactory ();
561
+ ((DefaultMessageHandlerMethodFactory ) this .messageHandlerMethodFactory ).afterPropertiesSet ();
534
562
}
535
563
536
- this .messageHandlerMethodFactory .afterPropertiesSet ();
537
564
prepareEvaluationContext ();
538
565
this .initialized = true ;
539
566
}
@@ -545,26 +572,27 @@ private synchronized void initialize() throws Exception {
545
572
*/
546
573
private void configureLocalMessageHandlerFactory () {
547
574
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 );
555
583
}
556
584
else {
557
585
messageConverter = new ConfigurableCompositeMessageConverter ();
558
586
}
559
587
NullAwarePayloadArgumentResolver nullResolver = new NullAwarePayloadArgumentResolver (messageConverter );
560
588
PayloadExpressionArgumentResolver payloadExpressionArgumentResolver = new PayloadExpressionArgumentResolver ();
561
- payloadExpressionArgumentResolver .setBeanFactory (getBeanFactory () );
589
+ payloadExpressionArgumentResolver .setBeanFactory (beanFactory );
562
590
563
591
PayloadsArgumentResolver payloadsArgumentResolver = new PayloadsArgumentResolver ();
564
- payloadsArgumentResolver .setBeanFactory (getBeanFactory () );
592
+ payloadsArgumentResolver .setBeanFactory (beanFactory );
565
593
566
594
MapArgumentResolver mapArgumentResolver = new MapArgumentResolver ();
567
- mapArgumentResolver .setBeanFactory (getBeanFactory () );
595
+ mapArgumentResolver .setBeanFactory (beanFactory );
568
596
569
597
List <HandlerMethodArgumentResolver > customArgumentResolvers = new LinkedList <>();
570
598
customArgumentResolvers .add (payloadExpressionArgumentResolver );
@@ -573,13 +601,14 @@ private void configureLocalMessageHandlerFactory() {
573
601
574
602
if (this .canProcessMessageList ) {
575
603
CollectionArgumentResolver collectionArgumentResolver = new CollectionArgumentResolver (true );
576
- collectionArgumentResolver .setBeanFactory (getBeanFactory () );
604
+ collectionArgumentResolver .setBeanFactory (beanFactory );
577
605
customArgumentResolvers .add (collectionArgumentResolver );
578
606
}
579
607
580
608
customArgumentResolvers .add (mapArgumentResolver );
581
609
582
- this .messageHandlerMethodFactory .setCustomArgumentResolvers (customArgumentResolvers );
610
+ ((DefaultMessageHandlerMethodFactory ) this .messageHandlerMethodFactory )
611
+ .setCustomArgumentResolvers (customArgumentResolvers );
583
612
}
584
613
585
614
@ SuppressWarnings ("unchecked" )
@@ -598,7 +627,8 @@ else if (e instanceof IllegalStateException) {
598
627
if (!(e .getCause () instanceof IllegalArgumentException ) ||
599
628
!e .getStackTrace ()[0 ].getClassName ().equals (InvocableHandlerMethod .class .getName ()) ||
600
629
(!"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
602
632
!e .getCause ().getMessage ().startsWith ("java.lang.ClassCastException@" ))) {
603
633
throw e ;
604
634
}
@@ -1133,7 +1163,9 @@ private String generateExpression(Method method) {
1133
1163
}
1134
1164
if (annotationType .equals (Payloads .class )) {
1135
1165
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
+ "." );
1137
1169
Assert .isTrue (Collection .class .isAssignableFrom (parameterType ),
1138
1170
"The @Payloads annotation can only be applied to a Collection-typed parameter." );
1139
1171
sb .append ("messages.![payload" );
0 commit comments