Skip to content

Commit d53433c

Browse files
artembilangaryrussell
authored andcommitted
GH-2690: Add MessageHandlerMethodFactory beans (#2798)
* GH-2690: Add MessageHandlerMethodFactory beans Fixes #2690 For more end-user flexibility and for simplicity of the `MessagingMethodInvokerHelper` logic, add `IntegrationContextUtils.MESSAGE_HANDLER_FACTORY_BEAN_NAME` and `IntegrationContextUtils.LIST_MESSAGE_HANDLER_FACTORY_BEAN_NAME` infrastructure beans * Use mentioned beans in the `MessagingMethodInvokerHelper` if any, otherwise fallback to the locally configured `MessageHandlerMethodFactory`, although this is necessary only for our non-Spring-based unit tests * Relax `BeanFactory` requirement for the `EvaluationContext` since it is going to be there in the Spring-based environment, but might not be available in the plain unit tests * Provide some optimization and refactoring for the `MessagingMethodInvokerHelper` * Remove deprecated `HandlerMethodArgumentResolversHolder` and `ARGUMENT_RESOLVERS_BEAN_NAME` & `LIST_ARGUMENT_RESOLVERS_BEAN_NAME` bean definitions and constants for their names * * Revert `getEvaluationContext(false)` usage. * Fix `MessagingMethodInvokerHelper` to propagate `BeanFactory` to argument resolvers if any
1 parent 0b3e2c9 commit d53433c

File tree

7 files changed

+144
-283
lines changed

7 files changed

+144
-283
lines changed

spring-integration-core/src/main/java/org/springframework/integration/config/DefaultConfiguringBeanFactoryPostProcessor.java

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2018 the original author or authors.
2+
* Copyright 2002-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -67,6 +67,7 @@
6767
import org.springframework.integration.support.converter.DefaultDatatypeChannelMessageConverter;
6868
import org.springframework.integration.support.json.JacksonPresent;
6969
import org.springframework.integration.support.utils.IntegrationUtils;
70+
import org.springframework.messaging.handler.annotation.support.DefaultMessageHandlerMethodFactory;
7071
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
7172
import org.springframework.util.ClassUtils;
7273

@@ -122,8 +123,8 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
122123
registerGlobalChannelInterceptorProcessor();
123124
registerDefaultDatatypeChannelMessageConverter();
124125
registerArgumentResolverMessageConverter();
125-
registerArgumentResolvers();
126-
registerListCapableArgumentResolvers();
126+
registerMessageHandlerMethodFactory();
127+
registerListMessageHandlerMethodFactory();
127128
}
128129
else if (logger.isWarnEnabled()) {
129130
logger.warn("BeanFactory is not a BeanDefinitionRegistry. " +
@@ -479,32 +480,32 @@ private void registerArgumentResolverMessageConverter() {
479480
}
480481
}
481482

482-
/**
483-
* Register the default
484-
* {@link org.springframework.integration.handler.support.HandlerMethodArgumentResolversHolder} for handler
485-
* method invocation.
486-
*/
487-
private void registerArgumentResolvers() {
488-
if (!this.beanFactory.containsBean(IntegrationContextUtils.ARGUMENT_RESOLVERS_BEAN_NAME)) {
489-
this.registry.registerBeanDefinition(IntegrationContextUtils.ARGUMENT_RESOLVERS_BEAN_NAME,
490-
internalArgumentResolversBuilder(false));
483+
private void registerMessageHandlerMethodFactory() {
484+
if (!this.beanFactory.containsBean(IntegrationContextUtils.MESSAGE_HANDLER_FACTORY_BEAN_NAME)) {
485+
BeanDefinitionBuilder messageHandlerMethodFactoryBuilder =
486+
createMessageHandlerMethodFactoryBeanDefinition(false);
487+
this.registry.registerBeanDefinition(IntegrationContextUtils.MESSAGE_HANDLER_FACTORY_BEAN_NAME,
488+
messageHandlerMethodFactoryBuilder.getBeanDefinition());
491489
}
492490
}
493491

494-
/**
495-
* Register the default
496-
* {@link org.springframework.integration.handler.support.HandlerMethodArgumentResolversHolder} for handler
497-
* method invocation for lists.
498-
*/
499-
private void registerListCapableArgumentResolvers() {
500-
if (!this.beanFactory.containsBean(IntegrationContextUtils.LIST_ARGUMENT_RESOLVERS_BEAN_NAME)) {
501-
this.registry.registerBeanDefinition(IntegrationContextUtils.LIST_ARGUMENT_RESOLVERS_BEAN_NAME,
502-
internalArgumentResolversBuilder(true));
492+
private void registerListMessageHandlerMethodFactory() {
493+
if (!this.beanFactory.containsBean(IntegrationContextUtils.LIST_MESSAGE_HANDLER_FACTORY_BEAN_NAME)) {
494+
BeanDefinitionBuilder messageHandlerMethodFactoryBuilder =
495+
createMessageHandlerMethodFactoryBeanDefinition(true);
496+
this.registry.registerBeanDefinition(IntegrationContextUtils.LIST_MESSAGE_HANDLER_FACTORY_BEAN_NAME,
497+
messageHandlerMethodFactoryBuilder.getBeanDefinition());
503498
}
504499
}
505500

506-
@SuppressWarnings("deprecation")
507-
private BeanDefinition internalArgumentResolversBuilder(boolean listCapable) {
501+
private BeanDefinitionBuilder createMessageHandlerMethodFactoryBeanDefinition(boolean listCapable) {
502+
return BeanDefinitionBuilder.genericBeanDefinition(DefaultMessageHandlerMethodFactory.class)
503+
.addPropertyReference("messageConverter",
504+
IntegrationContextUtils.ARGUMENT_RESOLVER_MESSAGE_CONVERTER_BEAN_NAME)
505+
.addPropertyValue("customArgumentResolvers", buildArgumentResolvers(listCapable));
506+
}
507+
508+
private ManagedList<BeanDefinition> buildArgumentResolvers(boolean listCapable) {
508509
ManagedList<BeanDefinition> resolvers = new ManagedList<>();
509510
resolvers.add(new RootBeanDefinition(PayloadExpressionArgumentResolver.class));
510511
BeanDefinitionBuilder builder =
@@ -513,7 +514,6 @@ private BeanDefinition internalArgumentResolversBuilder(boolean listCapable) {
513514
// TODO Validator ?
514515
resolvers.add(builder.getBeanDefinition());
515516
resolvers.add(new RootBeanDefinition(PayloadsArgumentResolver.class));
516-
resolvers.add(new RootBeanDefinition(MapArgumentResolver.class));
517517

518518
if (listCapable) {
519519
resolvers.add(
@@ -522,10 +522,8 @@ private BeanDefinition internalArgumentResolversBuilder(boolean listCapable) {
522522
.getBeanDefinition());
523523
}
524524

525-
return BeanDefinitionBuilder.genericBeanDefinition(
526-
org.springframework.integration.handler.support.HandlerMethodArgumentResolversHolder.class)
527-
.addConstructorArgValue(resolvers)
528-
.getBeanDefinition();
525+
resolvers.add(new RootBeanDefinition(MapArgumentResolver.class));
526+
return resolvers;
529527
}
530528

531529
}

spring-integration-core/src/main/java/org/springframework/integration/context/IntegrationContextUtils.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,14 +101,12 @@ public abstract class IntegrationContextUtils {
101101
public static final String ARGUMENT_RESOLVER_MESSAGE_CONVERTER_BEAN_NAME =
102102
"integrationArgumentResolverMessageConverter";
103103

104-
public static final String ARGUMENT_RESOLVERS_BEAN_NAME = "integrationArgumentResolvers";
105-
106-
public static final String LIST_ARGUMENT_RESOLVERS_BEAN_NAME = "integrationListArgumentResolvers";
107-
108104
public static final String DISPOSABLES_BEAN_NAME = "integrationDisposableAutoCreatedBeans";
109105

110106
public static final String MESSAGE_HANDLER_FACTORY_BEAN_NAME = "integrationMessageHandlerMethodFactory";
111107

108+
public static final String LIST_MESSAGE_HANDLER_FACTORY_BEAN_NAME = "integrationListMessageHandlerMethodFactory";
109+
112110
/**
113111
* @param beanFactory BeanFactory for lookup, must not be null.
114112
* @return The {@link MetadataStore} bean whose name is "metadataStore".

spring-integration-core/src/main/java/org/springframework/integration/handler/ExpressionCommandMessageProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public ExpressionCommandMessageProcessor(@Nullable MethodFilter methodFilter, @N
6161
}
6262
if (methodFilter != null) {
6363
MethodResolver methodResolver = new ExpressionCommandMethodResolver(methodFilter);
64-
getEvaluationContext(false).setMethodResolvers(Collections.singletonList(methodResolver));
64+
getEvaluationContext().setMethodResolvers(Collections.singletonList(methodResolver));
6565
}
6666
}
6767

spring-integration-core/src/main/java/org/springframework/integration/handler/support/HandlerMethodArgumentResolversHolder.java

Lines changed: 0 additions & 54 deletions
This file was deleted.

0 commit comments

Comments
 (0)