Skip to content

Commit 1853520

Browse files
authored
Merge pull request #26 from juanpmarin/master
fix(jackson): Spring compatible starter is not using the ObjectMapper instance configured by Spring
2 parents 143f3b1 + 2d11e0e commit 1853520

File tree

10 files changed

+125
-75
lines changed

10 files changed

+125
-75
lines changed

async/async-commons-standalone/src/main/java/org/reactivecommons/async/impl/config/RabbitMqConfig.java

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package org.reactivecommons.async.impl.config;
22

3-
import com.fasterxml.jackson.databind.DeserializationFeature;
4-
import com.fasterxml.jackson.databind.ObjectMapper;
53
import com.rabbitmq.client.Connection;
64
import com.rabbitmq.client.ConnectionFactory;
75
import lombok.extern.java.Log;
86
import org.reactivecommons.async.impl.communications.ReactiveMessageListener;
97
import org.reactivecommons.async.impl.communications.ReactiveMessageSender;
108
import org.reactivecommons.async.impl.communications.TopologyCreator;
11-
import org.reactivecommons.async.impl.converters.JacksonMessageConverter;
9+
import org.reactivecommons.async.impl.converters.json.JacksonMessageConverter;
1210
import org.reactivecommons.async.impl.converters.MessageConverter;
11+
import org.reactivecommons.async.impl.converters.json.ObjectMapperSupplier;
1312
import reactor.core.publisher.Mono;
1413
import reactor.core.scheduler.Scheduler;
1514
import reactor.core.scheduler.Schedulers;
@@ -27,7 +26,7 @@ public RabbitMqConfig(String appName) {
2726
this.appName = appName;
2827
}
2928

30-
public ReactiveMessageSender messageSender(ConnectionFactoryProvider provider, MessageConverter converter){
29+
public ReactiveMessageSender messageSender(ConnectionFactoryProvider provider, MessageConverter converter) {
3130
final Mono<Connection> senderConnection = createSenderConnectionMono(provider.getConnectionFactory(), "sender");
3231
final Sender sender = RabbitFlux.createSender(new SenderOptions().connectionMono(senderConnection));
3332
return new ReactiveMessageSender(sender, appName, converter, new TopologyCreator(senderConnection));
@@ -39,7 +38,7 @@ public ReactiveMessageListener messageListener(ConnectionFactoryProvider provide
3938
return new ReactiveMessageListener(receiver, new TopologyCreator(connection));
4039
}
4140

42-
public ConnectionFactoryProvider connectionFactory(RabbitProperties properties){
41+
public ConnectionFactoryProvider connectionFactory(RabbitProperties properties) {
4342
final ConnectionFactory factory = new ConnectionFactory();
4443
factory.setHost(properties.getHost());
4544
factory.setPort(properties.getPort());
@@ -52,19 +51,19 @@ public ConnectionFactoryProvider connectionFactory(RabbitProperties properties){
5251
return () -> factory;
5352
}
5453

55-
public MessageConverter messageConverter(){
56-
return new JacksonMessageConverter();
54+
public MessageConverter messageConverter(ObjectMapperSupplier objectMapperSupplier) {
55+
return new JacksonMessageConverter(objectMapperSupplier.get());
5756
}
5857

59-
Mono<Connection> createSenderConnectionMono(ConnectionFactory factory, String name){
58+
Mono<Connection> createSenderConnectionMono(ConnectionFactory factory, String name) {
6059
final Scheduler senderScheduler = Schedulers.newElastic(name + "_scheduler");
6160
return Mono.fromCallable(() -> factory.newConnection(name))
62-
.doOnError(err ->
63-
log.log(Level.SEVERE, "Error creating connection to RabbitMq Broker. Starting retry process...", err)
64-
)
65-
.retryBackoff(Long.MAX_VALUE, Duration.ofMillis(300), Duration.ofMillis(3000))
66-
.subscribeOn(senderScheduler)
67-
.cache();
61+
.doOnError(err ->
62+
log.log(Level.SEVERE, "Error creating connection to RabbitMq Broker. Starting retry process...", err)
63+
)
64+
.retryBackoff(Long.MAX_VALUE, Duration.ofMillis(300), Duration.ofMillis(3000))
65+
.subscribeOn(senderScheduler)
66+
.cache();
6867
}
6968

7069
}

async/async-commons-starter/src/main/java/org/reactivecommons/async/impl/config/RabbitMqConfig.java

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
import org.reactivecommons.async.impl.communications.ReactiveMessageSender;
88
import org.reactivecommons.async.impl.communications.TopologyCreator;
99
import org.reactivecommons.async.impl.config.props.BrokerConfigProps;
10-
import org.reactivecommons.async.impl.converters.JacksonMessageConverter;
1110
import org.reactivecommons.async.impl.converters.MessageConverter;
11+
import org.reactivecommons.async.impl.converters.json.DefaultObjectMapperSupplier;
12+
import org.reactivecommons.async.impl.converters.json.JacksonMessageConverter;
13+
import org.reactivecommons.async.impl.converters.json.ObjectMapperSupplier;
1214
import org.springframework.beans.factory.annotation.Value;
1315
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1416
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -34,7 +36,7 @@ public class RabbitMqConfig {
3436
private Integer maxConcurrency;
3537

3638
@Bean
37-
public ReactiveMessageSender messageSender(ConnectionFactoryProvider provider, MessageConverter converter, BrokerConfigProps props){
39+
public ReactiveMessageSender messageSender(ConnectionFactoryProvider provider, MessageConverter converter, BrokerConfigProps props) {
3840
final Mono<Connection> senderConnection = createSenderConnectionMono(provider.getConnectionFactory(), "sender");
3941
final Sender sender = RabbitFlux.createSender(new SenderOptions().connectionMono(senderConnection));
4042
return new ReactiveMessageSender(sender, props.getAppName(), converter, new TopologyCreator(senderConnection));
@@ -49,7 +51,7 @@ public ReactiveMessageListener messageListener(ConnectionFactoryProvider provide
4951

5052
@Bean
5153
@ConditionalOnMissingBean
52-
public ConnectionFactoryProvider connectionFactory(RabbitProperties properties){
54+
public ConnectionFactoryProvider connectionFactory(RabbitProperties properties) {
5355
final ConnectionFactory factory = new ConnectionFactory();
5456
PropertyMapper map = PropertyMapper.get();
5557
map.from(properties::determineHost).whenNonNull().to(factory::setHost);
@@ -66,19 +68,25 @@ public ConnectionFactoryProvider connectionFactory(RabbitProperties properties){
6668

6769
@Bean
6870
@ConditionalOnMissingBean
69-
public MessageConverter messageConverter(){
70-
return new JacksonMessageConverter();
71+
public ObjectMapperSupplier objectMapperSupplier() {
72+
return new DefaultObjectMapperSupplier();
7173
}
7274

73-
Mono<Connection> createSenderConnectionMono(ConnectionFactory factory, String name){
75+
@Bean
76+
@ConditionalOnMissingBean
77+
public MessageConverter messageConverter(ObjectMapperSupplier objectMapperSupplier) {
78+
return new JacksonMessageConverter(objectMapperSupplier.get());
79+
}
80+
81+
Mono<Connection> createSenderConnectionMono(ConnectionFactory factory, String name) {
7482
final Scheduler senderScheduler = Schedulers.elastic();
7583
return Mono.fromCallable(() -> factory.newConnection(name))
76-
.doOnError(err ->
77-
log.log(Level.SEVERE, "Error creating connection to RabbitMq Broker. Starting retry process...", err)
78-
)
79-
.retryBackoff(Long.MAX_VALUE, Duration.ofMillis(300), Duration.ofMillis(3000))
80-
.subscribeOn(senderScheduler)
81-
.cache();
84+
.doOnError(err ->
85+
log.log(Level.SEVERE, "Error creating connection to RabbitMq Broker. Starting retry process...", err)
86+
)
87+
.retryBackoff(Long.MAX_VALUE, Duration.ofMillis(300), Duration.ofMillis(3000))
88+
.subscribeOn(senderScheduler)
89+
.cache();
8290
}
8391

8492
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.reactivecommons.async.impl.converters.json;
2+
3+
import com.fasterxml.jackson.databind.DeserializationFeature;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
6+
public class DefaultObjectMapperSupplier implements ObjectMapperSupplier {
7+
8+
@Override
9+
public ObjectMapper get() {
10+
final ObjectMapper objectMapper = new ObjectMapper();
11+
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
12+
13+
return objectMapper;
14+
}
15+
16+
}
Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
package org.reactivecommons.async.impl.converters;
1+
package org.reactivecommons.async.impl.converters.json;
22

3-
4-
import com.fasterxml.jackson.databind.DeserializationFeature;
53
import com.fasterxml.jackson.databind.JsonNode;
64
import com.fasterxml.jackson.databind.ObjectMapper;
75
import lombok.Data;
86
import org.reactivecommons.api.domain.Command;
97
import org.reactivecommons.api.domain.DomainEvent;
108
import org.reactivecommons.async.api.AsyncQuery;
9+
import org.reactivecommons.async.impl.RabbitMessage;
1110
import org.reactivecommons.async.impl.communications.Message;
11+
import org.reactivecommons.async.impl.converters.MessageConverter;
1212
import org.reactivecommons.async.impl.exceptions.MessageConversionException;
13-
import org.reactivecommons.async.impl.RabbitMessage;
1413

1514
import java.io.IOException;
1615
import java.nio.charset.Charset;
@@ -21,9 +20,8 @@ public class JacksonMessageConverter implements MessageConverter {
2120

2221
private final ObjectMapper objectMapper;
2322

24-
public JacksonMessageConverter() {
25-
final ObjectMapper objectMapper = new ObjectMapper();
26-
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
23+
24+
public JacksonMessageConverter(ObjectMapper objectMapper) {
2725
this.objectMapper = objectMapper;
2826
}
2927

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.reactivecommons.async.impl.converters.json;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
5+
import java.util.function.Supplier;
6+
7+
public interface ObjectMapperSupplier extends Supplier<ObjectMapper> {
8+
}

async/async-commons/src/main/java/org/reactivecommons/async/impl/listeners/ApplicationCommandListener.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import org.reactivecommons.async.impl.RabbitMessage;
1212
import org.reactivecommons.async.impl.communications.ReactiveMessageListener;
1313
import org.reactivecommons.async.impl.communications.TopologyCreator;
14-
import org.reactivecommons.async.impl.converters.JacksonMessageConverter;
1514
import reactor.core.publisher.Mono;
1615
import reactor.rabbitmq.AcknowledgableDelivery;
1716
import reactor.rabbitmq.BindingSpecification;

async/async-commons/src/test/java/org/reactivecommons/async/impl/communications/ReactiveMessageSenderTest.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99
import org.mockito.Mock;
1010
import org.mockito.Spy;
1111
import org.mockito.junit.MockitoJUnitRunner;
12-
import org.reactivecommons.async.impl.converters.JacksonMessageConverter;
1312
import org.reactivecommons.async.impl.converters.MessageConverter;
13+
import org.reactivecommons.async.impl.converters.json.JacksonMessageConverter;
14+
import org.springframework.boot.test.context.SpringBootTest;
1415
import reactor.core.publisher.Flux;
1516
import reactor.core.publisher.Mono;
1617
import reactor.rabbitmq.OutboundMessageResult;
@@ -23,6 +24,7 @@
2324
import static org.mockito.Mockito.any;
2425
import static org.mockito.Mockito.when;
2526

27+
@SpringBootTest
2628
@RunWith(MockitoJUnitRunner.class)
2729
public class ReactiveMessageSenderTest {
2830

@@ -32,11 +34,13 @@ public class ReactiveMessageSenderTest {
3234

3335
private OutboundMessageResult result = new OutboundMessageResult(null, true);
3436

37+
private final ObjectMapper objectMapper = new ObjectMapper();
38+
3539
@Mock
3640
private Sender sender;
3741

3842
@Spy
39-
private final MessageConverter messageConverter = new JacksonMessageConverter();
43+
private final MessageConverter messageConverter = new JacksonMessageConverter(objectMapper);
4044

4145
@Before
4246
public void init() {
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package org.reactivecommons.async.impl.converters.json;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import lombok.Getter;
5+
import org.junit.Test;
6+
7+
import java.io.IOException;
8+
import java.util.Date;
9+
10+
import static org.assertj.core.api.Assertions.assertThat;
11+
12+
public class DefaultObjectMapperSupplierTest {
13+
14+
private final DefaultObjectMapperSupplier defaultObjectMapperSupplier = new DefaultObjectMapperSupplier();
15+
16+
17+
@Test
18+
public void shouldMapWithUnknownProperties() throws IOException {
19+
ObjectMapper objectMapper = defaultObjectMapperSupplier.get();
20+
21+
SampleClassExtra base = new SampleClassExtra("23", "one", new Date(), 45l);
22+
final String serialized = objectMapper.writeValueAsString(base);
23+
24+
final SampleClass result = objectMapper.readValue(serialized, SampleClass.class);
25+
26+
assertThat(result).isEqualToComparingFieldByField(base);
27+
}
28+
29+
@Getter
30+
private static class SampleClassExtra extends SampleClass {
31+
32+
public SampleClassExtra(String id, String name, Date date, Long newProp) {
33+
super(id, name, date);
34+
this.newProp = newProp;
35+
}
36+
37+
private final Long newProp;
38+
}
39+
40+
}
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
1-
package org.reactivecommons.async.impl.converters;
1+
package org.reactivecommons.async.impl.converters.json;
22

3-
import com.fasterxml.jackson.core.JsonProcessingException;
43
import com.fasterxml.jackson.databind.JsonNode;
54
import com.fasterxml.jackson.databind.ObjectMapper;
6-
import lombok.Getter;
7-
import lombok.RequiredArgsConstructor;
85
import org.junit.Test;
9-
import org.reactivecommons.api.domain.Command;
10-
import org.reactivecommons.async.impl.RabbitMessage;
116
import org.reactivecommons.async.impl.communications.Message;
127

138
import java.io.IOException;
@@ -18,7 +13,7 @@
1813
public class JacksonMessageConverterTest {
1914

2015
private final ObjectMapper objectMapper = new ObjectMapper();
21-
private final JacksonMessageConverter converter = new JacksonMessageConverter();
16+
private final JacksonMessageConverter converter = new JacksonMessageConverter(objectMapper);
2217

2318
@Test
2419
public void toMessage() {
@@ -42,26 +37,13 @@ public void toMessageWhenDataIsEmpty() throws IOException {
4237
assertThat(jsonNode.asText()).isEmpty();
4338
}
4439

45-
@Test
46-
public void shouldConvertWithUnknownProperties() throws JsonProcessingException {
47-
48-
final String value = objectMapper.writeValueAsString(new Command<>("test", "42",
49-
new SampleClassExtra("23", "one", new Date(), 45l)));
50-
51-
final Command<SampleClass> command = converter.readCommand(new RabbitMessage(value.getBytes(),
52-
null), SampleClass.class);
53-
54-
assertThat(command.getData()).extracting(SampleClass::getId, SampleClass::getName)
55-
.containsExactly("23", "one");
56-
}
57-
5840
@Test
5941
public void readValue() {
6042
Date date = new Date();
6143
final Message message = converter.toMessage(new SampleClass("35", "name1", date));
6244
final SampleClass value = converter.readValue(message, SampleClass.class);
6345
assertThat(value).extracting(SampleClass::getId, SampleClass::getName, SampleClass::getDate)
64-
.containsExactly("35", "name1", date);
46+
.containsExactly("35", "name1", date);
6547
}
6648

6749
@Test
@@ -71,22 +53,4 @@ public void readValueString() {
7153
assertThat(value).isEqualTo("Hi!");
7254
}
7355

74-
@RequiredArgsConstructor
75-
@Getter
76-
private static class SampleClass {
77-
private final String id;
78-
private final String name;
79-
private final Date date;
80-
}
81-
82-
@Getter
83-
private static class SampleClassExtra extends SampleClass {
84-
85-
public SampleClassExtra(String id, String name, Date date, Long newProp) {
86-
super(id, name, date);
87-
this.newProp = newProp;
88-
}
89-
90-
private final Long newProp;
91-
}
9256
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.reactivecommons.async.impl.converters.json;
2+
3+
import lombok.Getter;
4+
import lombok.RequiredArgsConstructor;
5+
6+
import java.util.Date;
7+
8+
@RequiredArgsConstructor
9+
@Getter
10+
class SampleClass {
11+
private final String id;
12+
private final String name;
13+
private final Date date;
14+
}

0 commit comments

Comments
 (0)