Skip to content

Commit 33ea1d9

Browse files
author
Daniel Bustamante Ospina
authored
Merge pull request #60 from reactive-commons/feature/enconding
add charset conversion when reading message body
2 parents 63d6502 + ebe613c commit 33ea1d9

File tree

3 files changed

+54
-11
lines changed

3 files changed

+54
-11
lines changed

async/async-rabbit/src/main/java/org/reactivecommons/async/rabbit/converters/json/JacksonMessageConverter.java

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66
import org.reactivecommons.api.domain.Command;
77
import org.reactivecommons.api.domain.DomainEvent;
88
import org.reactivecommons.async.api.AsyncQuery;
9-
import org.reactivecommons.async.rabbit.RabbitMessage;
109
import org.reactivecommons.async.commons.communications.Message;
1110
import org.reactivecommons.async.commons.converters.MessageConverter;
1211
import org.reactivecommons.async.commons.exceptions.MessageConversionException;
12+
import org.reactivecommons.async.rabbit.RabbitMessage;
1313

1414
import java.io.IOException;
15+
import java.io.UnsupportedEncodingException;
1516
import java.nio.charset.Charset;
17+
import java.nio.charset.StandardCharsets;
1618

1719
public class JacksonMessageConverter implements MessageConverter {
1820
private static final String ENCODING = Charset.defaultCharset().name();
@@ -28,7 +30,7 @@ public JacksonMessageConverter(ObjectMapper objectMapper) {
2830
@Override
2931
public <T> AsyncQuery<T> readAsyncQuery(Message message, Class<T> bodyClass) {
3032
try {
31-
final AsyncQueryJson asyncQueryJson = objectMapper.readValue(message.getBody(), AsyncQueryJson.class);
33+
final AsyncQueryJson asyncQueryJson = readValue(message, AsyncQueryJson.class);
3234
final T value = objectMapper.treeToValue(asyncQueryJson.getQueryData(), bodyClass);
3335
return new AsyncQuery<>(asyncQueryJson.getResource(), value);
3436
} catch (IOException e) {
@@ -39,7 +41,7 @@ public <T> AsyncQuery<T> readAsyncQuery(Message message, Class<T> bodyClass) {
3941
@Override
4042
public <T> DomainEvent<T> readDomainEvent(Message message, Class<T> bodyClass) {
4143
try {
42-
final DomainEventJson domainEventJson = objectMapper.readValue(message.getBody(), DomainEventJson.class);
44+
final DomainEventJson domainEventJson = readValue(message, DomainEventJson.class);
4345
final T value = objectMapper.treeToValue(domainEventJson.getData(), bodyClass);
4446
return new DomainEvent<>(domainEventJson.getName(), domainEventJson.getEventId(), value);
4547
} catch (IOException e) {
@@ -50,7 +52,7 @@ public <T> DomainEvent<T> readDomainEvent(Message message, Class<T> bodyClass) {
5052
@Override
5153
public <T> Command<T> readCommand(Message message, Class<T> bodyClass) {
5254
try {
53-
final CommandJson commandJson = objectMapper.readValue(message.getBody(), CommandJson.class);
55+
final CommandJson commandJson = readValue(message, CommandJson.class);
5456
final T value = objectMapper.treeToValue(commandJson.getData(), bodyClass);
5557
return new Command<>(commandJson.getName(), commandJson.getCommandId(), value);
5658
} catch (IOException e) {
@@ -61,7 +63,9 @@ public <T> Command<T> readCommand(Message message, Class<T> bodyClass) {
6163
@Override
6264
public <T> T readValue(Message message, Class<T> valueClass) {
6365
try {
64-
return objectMapper.readValue(message.getBody(), valueClass);
66+
byte[] utf8Body = ensureEncoding(message.getBody(), message.getProperties().getContentEncoding(),
67+
StandardCharsets.UTF_8.name());
68+
return objectMapper.readValue(utf8Body, valueClass);
6569
} catch (IOException e) {
6670
throw new MessageConversionException("Failed to convert Message content", e);
6771
}
@@ -71,21 +75,21 @@ public <T> T readValue(Message message, Class<T> valueClass) {
7175
@SuppressWarnings("unchecked")
7276
public <T> Command<T> readCommandStructure(Message message) {
7377
final CommandJson commandJson = readValue(message, CommandJson.class);
74-
return new Command<>(commandJson.getName(), commandJson.getCommandId(), (T)commandJson.getData());
78+
return new Command<>(commandJson.getName(), commandJson.getCommandId(), (T) commandJson.getData());
7579
}
7680

7781
@Override
7882
@SuppressWarnings("unchecked")
7983
public <T> DomainEvent<T> readDomainEventStructure(Message message) {
8084
final DomainEventJson eventJson = readValue(message, DomainEventJson.class);
81-
return new DomainEvent<>(eventJson.getName(), eventJson.getEventId(), (T)eventJson.getData());
85+
return new DomainEvent<>(eventJson.getName(), eventJson.getEventId(), (T) eventJson.getData());
8286
}
8387

8488
@Override
8589
@SuppressWarnings("unchecked")
8690
public <T> AsyncQuery<T> readAsyncQueryStructure(Message message) {
8791
final AsyncQueryJson asyncQueryJson = readValue(message, AsyncQueryJson.class);
88-
return new AsyncQuery<>(asyncQueryJson.getResource(), (T)asyncQueryJson.getQueryData());
92+
return new AsyncQuery<>(asyncQueryJson.getResource(), (T) asyncQueryJson.getQueryData());
8993
}
9094

9195
@Override
@@ -94,8 +98,7 @@ public Message toMessage(Object object) {
9498
try {
9599
String jsonString = this.objectMapper.writeValueAsString(object);
96100
bytes = jsonString.getBytes(ENCODING);
97-
}
98-
catch (IOException e) {
101+
} catch (IOException e) {
99102
throw new MessageConversionException("Failed to convert Message content", e);
100103
}
101104
RabbitMessage.RabbitMessageProperties props = new RabbitMessage.RabbitMessageProperties();
@@ -105,6 +108,14 @@ public Message toMessage(Object object) {
105108
return new RabbitMessage(bytes, props);
106109
}
107110

111+
private byte[] ensureEncoding(byte[] data, String fromEncoding, String toEncoding)
112+
throws UnsupportedEncodingException {
113+
if (fromEncoding.equalsIgnoreCase(toEncoding)) {
114+
return data;
115+
}
116+
return new String(data, fromEncoding).getBytes(toEncoding);
117+
}
118+
108119
@Data
109120
private static class AsyncQueryJson {
110121
private String resource;

async/async-rabbit/src/test/java/org/reactivecommons/async/rabbit/converters/json/JacksonMessageConverterTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import org.reactivecommons.api.domain.DomainEvent;
88
import org.reactivecommons.async.api.AsyncQuery;
99
import org.reactivecommons.async.commons.communications.Message;
10+
import org.reactivecommons.async.commons.exceptions.MessageConversionException;
11+
import org.reactivecommons.async.rabbit.RabbitMessage;
1012

1113
import java.io.IOException;
1214
import java.util.Date;
@@ -90,4 +92,34 @@ void shouldConvertToQueryStructure() {
9092
assertThat(jsonNode.findValue("name").asText()).isEqualTo("sample1");
9193
}
9294

95+
@Test
96+
void shouldNotFailWhenOriginCharsetIsNotUTF8() {
97+
// Arrange
98+
final String name = "example with word containing tilde áéíóúñ";
99+
final SampleClass data = new SampleClass("35", name, new Date());
100+
final Message message = sampleEncodedMessage(new AsyncQuery<>("query.name", data), "windows-1252");
101+
// Act
102+
final AsyncQuery<Object> query = converter.readAsyncQueryStructure(message);
103+
// Assert
104+
assertThat(query.getQueryData()).isInstanceOf(JsonNode.class);
105+
assertThat(query.getResource()).isEqualTo("query.name");
106+
final JsonNode jsonNode = (JsonNode) query.getQueryData();
107+
assertThat(jsonNode.findValue("name").asText()).isEqualTo(name);
108+
}
109+
110+
private Message sampleEncodedMessage(Object object, String encoding) {
111+
byte[] bytes;
112+
try {
113+
String jsonString = this.objectMapper.writeValueAsString(object);
114+
bytes = jsonString.getBytes(encoding);
115+
} catch (IOException e) {
116+
throw new MessageConversionException("Failed to convert Message content", e);
117+
}
118+
RabbitMessage.RabbitMessageProperties props = new RabbitMessage.RabbitMessageProperties();
119+
props.setContentType("application/json");
120+
props.setContentEncoding(encoding);
121+
props.setContentLength(bytes.length);
122+
return new RabbitMessage(bytes, props);
123+
}
124+
93125
}

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version=1.0.0-beta9
1+
version=1.0.0-beta10
22
springBootVersion=2.4.2
33
gradleVersionsVersion=0.36.0
44
toPublish=async-commons,async-commons-api,async-commons-rabbit-standalone,async-commons-rabbit-starter,domain-events-api,async-rabbit

0 commit comments

Comments
 (0)