From 5c618930fa0f94996d148b114a19e499d8227e7b Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Wed, 15 Aug 2018 15:18:09 -0400 Subject: [PATCH] Revert ContentTypeConfiguration changes After fixing https://jira.spring.io/browse/INT-4517 we don't need a hack in the `ContentTypeConfiguration` about removal of the `IntegrationContextUtils.ARGUMENT_RESOLVER_MESSAGE_CONVERTER_BEAN_NAME` `BeanDefinition` and registering our own later * Provide some code polishing for the `ContentTypeConfiguration` removing some redundant code and providing consistency with components it uses * Add `ElementType.PARAMETER` target for the `StreamMessageConverter` annotation to let the list of appropriate converters to be inject via method parameters in the `@Bean` definition * Tentative use SI `5.1.0.BUILD-SNAPSHOT` until Spring Boot 2.1 M2 --- spring-cloud-stream/pom.xml | 1 + .../annotation/StreamMessageConverter.java | 10 ++- .../config/ContentTypeConfiguration.java | 67 ++++--------------- 3 files changed, 21 insertions(+), 57 deletions(-) diff --git a/spring-cloud-stream/pom.xml b/spring-cloud-stream/pom.xml index ebbd057cc..08b32530e 100644 --- a/spring-cloud-stream/pom.xml +++ b/spring-cloud-stream/pom.xml @@ -30,6 +30,7 @@ org.springframework.integration spring-integration-core + 5.1.0.BUILD-SNAPSHOT org.springframework.integration diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/StreamMessageConverter.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/StreamMessageConverter.java index fc47cf47e..dd31a18ca 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/StreamMessageConverter.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/StreamMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 the original author or authors. + * Copyright 2017-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,12 +25,16 @@ import java.lang.annotation.Target; import org.springframework.beans.factory.annotation.Qualifier; /** - * Marker to tag {@link org.springframework.messaging.converter.MessageConverter} beans that will be added to the {@link org.springframework.cloud.stream.converter.CompositeMessageConverterFactory} + * Marker to tag {@link org.springframework.messaging.converter.MessageConverter} beans + * that will be added to the {@link org.springframework.cloud.stream.converter.CompositeMessageConverterFactory}. + * * @author Vinicius Carvalho + * @author Arten Bilan */ -@Target({ElementType.FIELD,ElementType.METHOD}) +@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER }) @Retention(RetentionPolicy.RUNTIME) @Documented @Qualifier public @interface StreamMessageConverter { + } diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/ContentTypeConfiguration.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/ContentTypeConfiguration.java index 3e651f3cf..4e509ec02 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/ContentTypeConfiguration.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/ContentTypeConfiguration.java @@ -16,84 +16,43 @@ package org.springframework.cloud.stream.config; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.cloud.stream.annotation.StreamMessageConverter; import org.springframework.cloud.stream.converter.CompositeMessageConverterFactory; -import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Role; import org.springframework.integration.context.IntegrationContextUtils; import org.springframework.integration.support.converter.ConfigurableCompositeMessageConverter; import org.springframework.messaging.converter.MessageConverter; -import org.springframework.util.CollectionUtils; /** * @author Vinicius Carvalho + * @author Artem Bilan */ @Configuration @Role(BeanDefinition.ROLE_INFRASTRUCTURE) -public class ContentTypeConfiguration implements InitializingBean { - - @Autowired(required = false) - private ObjectMapper objectMapper; - - @Autowired - private ConfigurableApplicationContext context; - - /** - * User defined custom message converters - */ - @Autowired(required = false) - @StreamMessageConverter - private List customMessageConverters; - - @Override - public void afterPropertiesSet() throws Exception { - if (context.getBeanFactory().containsBean(IntegrationContextUtils.ARGUMENT_RESOLVER_MESSAGE_CONVERTER_BEAN_NAME)) { - BeanDefinitionRegistry beanDefinitionRegistry = - (BeanDefinitionRegistry) context.getAutowireCapableBeanFactory(); - beanDefinitionRegistry.removeBeanDefinition(IntegrationContextUtils.ARGUMENT_RESOLVER_MESSAGE_CONVERTER_BEAN_NAME); - } - } +public class ContentTypeConfiguration { @Bean - @SuppressWarnings("unchecked") - public CompositeMessageConverterFactory compositeMessageConverterFactory() { - List messageConverters = new ArrayList<>(); - if (!CollectionUtils.isEmpty(this.customMessageConverters)) { - messageConverters.addAll(Collections.unmodifiableCollection(this.customMessageConverters)); - } - CompositeMessageConverterFactory compositeMessageConverterFactory = new CompositeMessageConverterFactory(messageConverters, this.objectMapper); + public CompositeMessageConverterFactory compositeMessageConverterFactory( + ObjectProvider objectMapperObjectProvider, + @StreamMessageConverter List customMessageConverters) { - // Manually register a bean named as `integrationArgumentResolverMessageConverter` - // in order to avoid bean name overriding exceptions. This name exists in Spring Integration. - // The afterProperties method should have removed the bean from the registry and then - // we are re-registering it again through a different bean definition. - BeanDefinitionRegistry beanDefinitionRegistry = - (BeanDefinitionRegistry) context.getAutowireCapableBeanFactory(); + return new CompositeMessageConverterFactory(customMessageConverters, + objectMapperObjectProvider.getIfAvailable(ObjectMapper::new)); + } - ConfigurableCompositeMessageConverter configurableCompositeMessageConverter = - new ConfigurableCompositeMessageConverter(compositeMessageConverterFactory.getMessageConverterForAllRegistered().getConverters()); + @Bean(name = IntegrationContextUtils.ARGUMENT_RESOLVER_MESSAGE_CONVERTER_BEAN_NAME) + public ConfigurableCompositeMessageConverter configurableCompositeMessageConverter( + CompositeMessageConverterFactory factory) { - BeanDefinition configurableCompositeMessageConverterDefn = - BeanDefinitionBuilder.genericBeanDefinition((Class) configurableCompositeMessageConverter.getClass(), - () -> configurableCompositeMessageConverter) - .getRawBeanDefinition(); - - beanDefinitionRegistry.registerBeanDefinition(IntegrationContextUtils.ARGUMENT_RESOLVER_MESSAGE_CONVERTER_BEAN_NAME, configurableCompositeMessageConverterDefn); - - return compositeMessageConverterFactory; + return new ConfigurableCompositeMessageConverter(factory.getMessageConverterForAllRegistered().getConverters()); } }