Skip to content

Commit 4ecbe4e

Browse files
committed
Fix issue with multiple ObjectMapper beans
1 parent c023090 commit 4ecbe4e

File tree

7 files changed

+51
-13
lines changed

7 files changed

+51
-13
lines changed

core/spring-cloud-stream-integration-tests/pom.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@
2525
<artifactId>spring-cloud-stream-test-binder</artifactId>
2626
<scope>test</scope>
2727
</dependency>
28+
<dependency>
29+
<groupId>tools.jackson.dataformat</groupId>
30+
<artifactId>jackson-dataformat-cbor</artifactId>
31+
<optional>true</optional>
32+
</dependency>
2833
<dependency>
2934
<groupId>org.springframework.boot</groupId>
3035
<artifactId>spring-boot-starter-test</artifactId>
@@ -43,16 +48,19 @@
4348
<dependency>
4449
<groupId>org.jetbrains.kotlin</groupId>
4550
<artifactId>kotlin-test</artifactId>
51+
<version>2.2.20</version>
4652
<scope>test</scope>
4753
</dependency>
4854
<dependency>
4955
<groupId>org.jetbrains.kotlin</groupId>
5056
<artifactId>kotlin-stdlib-jdk8</artifactId>
57+
<version>2.2.20</version>
5158
<optional>true</optional>
5259
</dependency>
5360
<dependency>
5461
<groupId>org.jetbrains.kotlin</groupId>
5562
<artifactId>kotlin-reflect</artifactId>
63+
<version>2.2.20</version>
5664
<optional>true</optional>
5765
</dependency>
5866
<dependency>

core/spring-cloud-stream-integration-tests/src/test/java/org/springframework/cloud/stream/function/ScenarioTests.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import org.springframework.context.annotation.Configuration;
3434
import org.springframework.messaging.Message;
3535
import org.springframework.messaging.support.GenericMessage;
36+
import tools.jackson.databind.ObjectMapper;
37+
import tools.jackson.dataformat.cbor.CBORMapper;
3638

3739
import static org.assertj.core.api.Assertions.assertThat;
3840

@@ -131,6 +133,16 @@ void test2113() {
131133

132134

133135

136+
@Test
137+
void testMultipleObjectMappers() {
138+
try (ConfigurableApplicationContext context = new SpringApplicationBuilder(
139+
TestChannelBinderConfiguration.getCompleteConfiguration(MultipleJsonConverterConfiguration.class))
140+
.web(WebApplicationType.NONE)
141+
.run("--spring.jmx.enabled=false")) {
142+
}
143+
}
144+
145+
134146
@EnableAutoConfiguration
135147
@Configuration
136148
public static class TestConfiguration {
@@ -143,6 +155,19 @@ public <I, O> Function<I, O> genericTypeFunction() {
143155
}
144156
}
145157

158+
@EnableAutoConfiguration
159+
@Configuration
160+
public static class MultipleJsonConverterConfiguration {
161+
@Bean
162+
public ObjectMapper cborObjectMapper() {
163+
return new CBORMapper();
164+
}
165+
@Bean
166+
public ObjectMapper objectMapper() {
167+
return new ObjectMapper();
168+
}
169+
}
170+
146171
@EnableAutoConfiguration
147172
@Configuration
148173
public static class SupplierConfiguration {

core/spring-cloud-stream-test-support/src/main/java/org/springframework/cloud/stream/binder/AbstractBinderTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ private MessageConverterConfigurer createConverterConfigurer(String channelName,
381381
bindingServiceProperties.afterPropertiesSet();
382382
MessageConverterConfigurer messageConverterConfigurer = new MessageConverterConfigurer(
383383
bindingServiceProperties,
384-
new CompositeMessageConverterFactory(null, null, null).getMessageConverterForAllRegistered());
384+
new CompositeMessageConverterFactory(null, null).getMessageConverterForAllRegistered());
385385
messageConverterConfigurer.setBeanFactory(applicationContext.getBeanFactory());
386386
return messageConverterConfigurer;
387387
}

core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/AbstractMessageChannelBinder.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.function.Consumer;
2424

2525
import org.apache.commons.logging.Log;
26+
import org.springframework.cloud.function.json.JacksonMapper;
2627
import tools.jackson.core.JacksonException;
2728
import tools.jackson.core.JsonGenerator;
2829
import tools.jackson.databind.ObjectMapper;
@@ -141,12 +142,19 @@ public AbstractMessageChannelBinder(String[] headersToEmbed,
141142

142143
@Override
143144
protected void onInit() throws Exception {
144-
if (!CollectionUtils.isEmpty(this.getApplicationContext().getBeansOfType(ObjectMapper.class))) {
145-
this.objectMapper = this.getApplicationContext().getBean(ObjectMapper.class);
145+
if (!CollectionUtils.isEmpty(this.getApplicationContext().getBeansOfType(JacksonMapper.class))) {
146+
JacksonMapper jacksonMapper = this.getApplicationContext().getBean(JacksonMapper.class);
147+
this.objectMapper = jacksonMapper.getObjectMapper();
146148
}
147149
else {
148150
this.objectMapper = new ObjectMapper();
149151
}
152+
// if (!CollectionUtils.isEmpty(this.getApplicationContext().getBeansOfType(ObjectMapper.class))) {
153+
// this.objectMapper = this.getApplicationContext().getBean(ObjectMapper.class);
154+
// }
155+
// else {
156+
//
157+
// }
150158
SimpleModule module = new SimpleModule();
151159
module.addSerializer(Expression.class, new ExpressionSerializer(Expression.class));
152160
this.objectMapper = this.objectMapper.rebuild().build();

core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/ContentTypeConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public CompositeMessageConverter configurableCompositeMessageConverter(
5151
.filter(c -> isConverterEligible(c)).collect(Collectors.toList());
5252

5353
CompositeMessageConverterFactory factory =
54-
new CompositeMessageConverterFactory(customMessageConverters, objectMapperObjectProvider.getIfAvailable(ObjectMapper::new), jsonMapper);
54+
new CompositeMessageConverterFactory(customMessageConverters, jsonMapper);
5555

5656
return factory.getMessageConverterForAllRegistered();
5757
}

core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/converter/CompositeMessageConverterFactory.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,25 +54,22 @@ public class CompositeMessageConverterFactory {
5454

5555
private final Log log = LogFactory.getLog(CompositeMessageConverterFactory.class);
5656

57-
private final ObjectMapper objectMapper;
57+
//private final ObjectMapper objectMapper;
5858

5959
private final List<MessageConverter> converters;
6060

6161
private final JsonMapper jsonMapper;
6262

6363
public CompositeMessageConverterFactory() {
64-
this(Collections.<MessageConverter>emptyList(), new ObjectMapper(), null);
64+
this(Collections.<MessageConverter>emptyList(), null);
6565
}
6666

6767
/**
6868
* @param customConverters a list of {@link AbstractMessageConverter}
69-
* @param objectMapper object mapper for for serialization / deserialization
7069
*/
7170
public CompositeMessageConverterFactory(
72-
List<? extends MessageConverter> customConverters,
73-
ObjectMapper objectMapper, JsonMapper jsonMapper) {
74-
this.objectMapper = objectMapper == null ? new ObjectMapper() : objectMapper;
75-
this.jsonMapper = jsonMapper == null ? new JacksonMapper(this.objectMapper) : jsonMapper;
71+
List<? extends MessageConverter> customConverters, JsonMapper jsonMapper) {
72+
this.jsonMapper = jsonMapper == null ? new JacksonMapper(new ObjectMapper()) : jsonMapper;
7673
if (!CollectionUtils.isEmpty(customConverters)) {
7774
this.converters = new ArrayList<>(customConverters);
7875
}

core/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binding/MessageConverterConfigurerTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ void configureOutputChannelWithBadContentType() {
5050
bindingProps.setContentType("application/json");
5151
props.setBindings(Collections.singletonMap("foo", bindingProps));
5252
CompositeMessageConverterFactory converterFactory = new CompositeMessageConverterFactory(
53-
Collections.<MessageConverter>emptyList(), null, null);
53+
Collections.<MessageConverter>emptyList(), null);
5454
MessageConverterConfigurer configurer = new MessageConverterConfigurer(props,
5555
converterFactory.getMessageConverterForAllRegistered());
5656
QueueChannel out = new QueueChannel();
@@ -82,7 +82,7 @@ protected Object convertToInternal(Object payload, MessageHeaders headers,
8282

8383
};
8484
CompositeMessageConverterFactory converterFactory = new CompositeMessageConverterFactory(
85-
Collections.<MessageConverter>singletonList(converter), null, null);
85+
Collections.<MessageConverter>singletonList(converter), null);
8686
MessageConverterConfigurer configurer = new MessageConverterConfigurer(props,
8787
converterFactory.getMessageConverterForAllRegistered());
8888
QueueChannel out = new QueueChannel();

0 commit comments

Comments
 (0)