From 1510e587d6bd79c20503f66974c4cacd5d3b50e5 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Mon, 5 Feb 2018 16:04:11 -0500 Subject: [PATCH] Allows bus jackson config to use autowired ObjectMapper. Fixes gh-95 --- .../jackson/BusJacksonAutoConfiguration.java | 27 +++++++++----- .../cloud/bus/jackson/SubtypeModuleTests.java | 36 ++++++++++++++----- 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/jackson/BusJacksonAutoConfiguration.java b/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/jackson/BusJacksonAutoConfiguration.java index 58435c0..39d2da0 100644 --- a/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/jackson/BusJacksonAutoConfiguration.java +++ b/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/jackson/BusJacksonAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2017 the original author or authors. + * Copyright 2013-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. @@ -23,6 +23,7 @@ import java.util.List; import java.util.Set; import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -59,8 +60,8 @@ public class BusJacksonAutoConfiguration { @Bean @ConditionalOnMissingBean(name = "busJsonConverter") - public BusJacksonMessageConverter busJsonConverter() { - return new BusJacksonMessageConverter(); + public BusJacksonMessageConverter busJsonConverter(@Autowired(required = false) ObjectMapper objectMapper) { + return new BusJacksonMessageConverter(objectMapper); } } @@ -71,10 +72,24 @@ class BusJacksonMessageConverter extends AbstractMessageConverter private static final String DEFAULT_PACKAGE = ClassUtils .getPackageName(RemoteApplicationEvent.class); - private final ObjectMapper mapper = new ObjectMapper(); + private final ObjectMapper mapper; private String[] packagesToScan = new String[] { DEFAULT_PACKAGE }; + public BusJacksonMessageConverter() { + this(null); + } + + public BusJacksonMessageConverter(ObjectMapper objectMapper) { + super(MimeTypeUtils.APPLICATION_JSON); + + if (objectMapper != null) { + this.mapper = objectMapper; + } else { + this.mapper = new ObjectMapper(); + } + } + public void setPackagesToScan(String[] packagesToScan) { List packages = new ArrayList<>(Arrays.asList(packagesToScan)); if (!packages.contains(DEFAULT_PACKAGE)) { @@ -83,10 +98,6 @@ class BusJacksonMessageConverter extends AbstractMessageConverter this.packagesToScan = packages.toArray(new String[0]); } - public BusJacksonMessageConverter() { - super(MimeTypeUtils.APPLICATION_JSON); - } - private Class[] findSubTypes() { List> types = new ArrayList<>(); if (this.packagesToScan != null) { diff --git a/spring-cloud-bus/src/test/java/org/springframework/cloud/bus/jackson/SubtypeModuleTests.java b/spring-cloud-bus/src/test/java/org/springframework/cloud/bus/jackson/SubtypeModuleTests.java index 4fbc7c1..f4a6b3e 100644 --- a/spring-cloud-bus/src/test/java/org/springframework/cloud/bus/jackson/SubtypeModuleTests.java +++ b/spring-cloud-bus/src/test/java/org/springframework/cloud/bus/jackson/SubtypeModuleTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2017 the original author or authors. + * Copyright 2013-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. @@ -17,9 +17,6 @@ package org.springframework.cloud.bus.jackson; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - import org.junit.Test; import org.springframework.cloud.bus.event.AckRemoteApplicationEvent; import org.springframework.cloud.bus.event.RemoteApplicationEvent; @@ -30,6 +27,11 @@ import org.springframework.messaging.support.MessageBuilder; import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.PropertyNamingStrategy; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; /** * @author Spencer Gibb @@ -61,9 +63,25 @@ public class SubtypeModuleTests { assertTrue("event is wrong type", event instanceof AnotherRemoteApplicationEvent); } + @Test + public void testDeserializeCustomizedObjectMapper() throws Exception { + ObjectMapper mapper = new ObjectMapper(); + mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); + + BusJacksonMessageConverter converter = new BusJacksonAutoConfiguration().busJsonConverter(mapper); + converter.afterPropertiesSet(); + Object event = converter.fromMessage( + MessageBuilder.withPayload("{\"type\":\"TestRemoteApplicationEvent\", \"origin_service\":\"myorigin\"}").build(), + RemoteApplicationEvent.class); + assertThat(event) + .isNotNull() + .isInstanceOf(TestRemoteApplicationEvent.class); + assertThat(TestRemoteApplicationEvent.class.cast(event).getOriginService()).isEqualTo("myorigin"); + } + @Test public void testDeserializeWithMessageConverter() throws Exception { - BusJacksonMessageConverter converter = new BusJacksonAutoConfiguration().busJsonConverter(); + BusJacksonMessageConverter converter = new BusJacksonAutoConfiguration().busJsonConverter(null); converter.afterPropertiesSet(); Object event = converter.fromMessage( MessageBuilder.withPayload("{\"type\":\"TestRemoteApplicationEvent\"}").build(), @@ -73,7 +91,7 @@ public class SubtypeModuleTests { @Test public void testDeserializeUnknownTypeWithMessageConverter() throws Exception { - BusJacksonMessageConverter converter = new BusJacksonAutoConfiguration().busJsonConverter(); + BusJacksonMessageConverter converter = new BusJacksonAutoConfiguration().busJsonConverter(null); converter.afterPropertiesSet(); Object event = converter.fromMessage( MessageBuilder.withPayload("{\"type\":\"NotDefinedTestRemoteApplicationEvent\"}").build(), @@ -85,7 +103,7 @@ public class SubtypeModuleTests { @Test public void testDeserializeJsonTypeWithMessageConverter() throws Exception { - BusJacksonMessageConverter converter = new BusJacksonAutoConfiguration().busJsonConverter(); + BusJacksonMessageConverter converter = new BusJacksonAutoConfiguration().busJsonConverter(null); converter.afterPropertiesSet(); Object event = converter.fromMessage( MessageBuilder.withPayload("{\"type\":\"typed\"}").build(), @@ -98,7 +116,7 @@ public class SubtypeModuleTests { */ @Test public void testDeserializeAckRemoteApplicationEventWithKnownType() throws Exception { - BusJacksonMessageConverter converter = new BusJacksonAutoConfiguration().busJsonConverter(); + BusJacksonMessageConverter converter = new BusJacksonAutoConfiguration().busJsonConverter(null); converter.afterPropertiesSet(); Object event = converter.fromMessage(MessageBuilder.withPayload( "{\"type\":\"AckRemoteApplicationEvent\", \"event\":\"org.springframework.cloud.bus.event.test.TestRemoteApplicationEvent\"}") @@ -113,7 +131,7 @@ public class SubtypeModuleTests { */ @Test public void testDeserializeAckRemoteApplicationEventWithUnknownType() throws Exception { - BusJacksonMessageConverter converter = new BusJacksonAutoConfiguration().busJsonConverter(); + BusJacksonMessageConverter converter = new BusJacksonAutoConfiguration().busJsonConverter(null); converter.afterPropertiesSet(); Object event = converter.fromMessage(MessageBuilder.withPayload( "{\"type\":\"AckRemoteApplicationEvent\", \"event\":\"foo.bar.TestRemoteApplicationEvent\"}").build(),