From f1537ed28093ae432fa892a8c5ecab2796e36362 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Mon, 15 Apr 2019 18:31:52 -0400 Subject: [PATCH] Remove usage of deprecated code The `HandlerMethodArgumentResolversHolder` has been deprecated in SI-5.1 and now it is removed in SI-5.2 To make current Spring cloud Stream compatible with the latest Spring Boot, which is pulled by the latest Spring Cloud, remove usage of that deprecated class in the current version in favor of internal logic applied in the SI Looks like the `BinderFactoryConfiguration` is deprecated as well and is going to be removed in the future release anyway --- .../config/BinderFactoryConfiguration.java | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BinderFactoryConfiguration.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BinderFactoryConfiguration.java index f470f910d..2b16a16d1 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BinderFactoryConfiguration.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BinderFactoryConfiguration.java @@ -17,7 +17,6 @@ package org.springframework.cloud.stream.config; import java.io.IOException; -import java.lang.reflect.Field; import java.net.URL; import java.util.ArrayList; import java.util.Collection; @@ -33,7 +32,6 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanCreationException; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; @@ -69,8 +67,12 @@ import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; import org.springframework.core.io.support.PropertiesLoaderUtils; import org.springframework.integration.context.IntegrationContextUtils; -import org.springframework.integration.handler.support.HandlerMethodArgumentResolversHolder; +import org.springframework.integration.handler.support.MapArgumentResolver; +import org.springframework.integration.handler.support.PayloadExpressionArgumentResolver; +import org.springframework.integration.handler.support.PayloadsArgumentResolver; +import org.springframework.integration.support.NullAwarePayloadArgumentResolver; import org.springframework.lang.Nullable; +import org.springframework.messaging.converter.CompositeMessageConverter; import org.springframework.messaging.handler.annotation.support.DefaultMessageHandlerMethodFactory; import org.springframework.messaging.handler.annotation.support.HeaderMethodArgumentResolver; import org.springframework.messaging.handler.annotation.support.HeadersMethodArgumentResolver; @@ -78,7 +80,6 @@ import org.springframework.messaging.handler.annotation.support.MessageHandlerMe import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; -import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; import org.springframework.validation.Validator; @@ -133,12 +134,12 @@ public class BinderFactoryConfiguration { @Bean(IntegrationContextUtils.MESSAGE_HANDLER_FACTORY_BEAN_NAME) public static MessageHandlerMethodFactory messageHandlerMethodFactory( CompositeMessageConverterFactory compositeMessageConverterFactory, - @Qualifier(IntegrationContextUtils.ARGUMENT_RESOLVERS_BEAN_NAME) HandlerMethodArgumentResolversHolder ahmar, @Nullable Validator validator, ConfigurableListableBeanFactory clbf) { DefaultMessageHandlerMethodFactory messageHandlerMethodFactory = new DefaultMessageHandlerMethodFactory(); - messageHandlerMethodFactory.setMessageConverter( - compositeMessageConverterFactory.getMessageConverterForAllRegistered()); + CompositeMessageConverter messageConverter = + compositeMessageConverterFactory.getMessageConverterForAllRegistered(); + messageHandlerMethodFactory.setMessageConverter(messageConverter); /* * We essentially do the same thing as the @@ -155,21 +156,25 @@ public class BinderFactoryConfiguration { */ List resolvers = new LinkedList<>(); resolvers.add(new SmartPayloadArgumentResolver( - compositeMessageConverterFactory.getMessageConverterForAllRegistered(), + messageConverter, validator)); resolvers.add(new SmartMessageMethodArgumentResolver( - compositeMessageConverterFactory.getMessageConverterForAllRegistered())); + messageConverter)); resolvers.add(new HeaderMethodArgumentResolver(null, clbf)); resolvers.add(new HeadersMethodArgumentResolver()); - resolvers.addAll(ahmar.getResolvers()); - // modify HandlerMethodArgumentResolversHolder - Field field = ReflectionUtils - .findField(HandlerMethodArgumentResolversHolder.class, "resolvers"); - field.setAccessible(true); - ((List) ReflectionUtils.getField(field, ahmar)).clear(); - resolvers.forEach(ahmar::addResolver); - // -- + // Copy the order from Spring Integration for compatibility with SI 5.2 + resolvers.add(new PayloadExpressionArgumentResolver()); + resolvers.add(new NullAwarePayloadArgumentResolver(messageConverter)); + PayloadExpressionArgumentResolver payloadExpressionArgumentResolver = new PayloadExpressionArgumentResolver(); + payloadExpressionArgumentResolver.setBeanFactory(clbf); + resolvers.add(payloadExpressionArgumentResolver); + PayloadsArgumentResolver payloadsArgumentResolver = new PayloadsArgumentResolver(); + payloadsArgumentResolver.setBeanFactory(clbf); + resolvers.add(payloadsArgumentResolver); + MapArgumentResolver mapArgumentResolver = new MapArgumentResolver(); + mapArgumentResolver.setBeanFactory(clbf); + resolvers.add(mapArgumentResolver); messageHandlerMethodFactory.setArgumentResolvers(resolvers); messageHandlerMethodFactory.setValidator(validator);