Skip to content

Commit 8f6b560

Browse files
npoirierNormand Poirier
andauthored
Fix SQS message attributes mapping with custom data types (#746)
Co-authored-by: Normand Poirier <[email protected]>
1 parent 45141cb commit 8f6b560

File tree

2 files changed

+57
-7
lines changed

2 files changed

+57
-7
lines changed

spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/support/converter/SqsHeaderMapper.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -181,11 +181,16 @@ private Object getValue(Map.Entry<String, MessageAttributeValue> entry) {
181181
MessageAttributeValue value = entry.getValue();
182182
String dataType = value.dataType();
183183
Assert.notNull(dataType, "dataType must not be null");
184-
return MessageAttributeDataTypes.STRING.equals(dataType)
185-
? value.stringValue()
186-
: MessageAttributeDataTypes.BINARY.equals(dataType)
187-
? value.binaryValue()
188-
: getNumberValue(value);
184+
185+
if (dataType.contains(".")) {
186+
dataType = dataType.substring(0, dataType.indexOf('.'));
187+
}
188+
189+
return switch (dataType) {
190+
case MessageAttributeDataTypes.NUMBER -> getNumberValue(value);
191+
case MessageAttributeDataTypes.BINARY -> value.binaryValue();
192+
default -> value.stringValue();
193+
};
189194
}
190195

191196
private Map<String, String> getMessageSystemAttributesAsHeaders(Message source) {

spring-cloud-aws-sqs/src/test/java/io/awspring/cloud/sqs/support/converter/SqsHeaderMapperTests.java

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,43 @@ void shouldAddExtraHeader() {
5454

5555
@Test
5656
void shouldAddStringMessageAttributes() {
57+
SqsHeaderMapper mapper = new SqsHeaderMapper();
58+
String headerName = "stringAttribute";
59+
String headerValue = "myString";
60+
Message message = Message.builder().body("payload")
61+
.messageAttributes(
62+
Map.of(headerName,
63+
MessageAttributeValue.builder().dataType(MessageAttributeDataTypes.STRING)
64+
.stringValue(headerValue).build()))
65+
.messageId(UUID.randomUUID().toString()).build();
66+
MessageHeaders headers = mapper.toHeaders(message);
67+
assertThat(headers.get(headerName)).isEqualTo(headerValue);
68+
}
69+
70+
@Test
71+
void shouldAddStringCustomMessageAttributes() {
72+
SqsHeaderMapper mapper = new SqsHeaderMapper();
73+
String headerName = "stringAttribute";
74+
String headerValue = "myString";
75+
Message message = Message.builder().body("payload")
76+
.messageAttributes(
77+
Map.of(headerName,
78+
MessageAttributeValue.builder().dataType(MessageAttributeDataTypes.STRING + ".Array")
79+
.stringValue(headerValue).build()))
80+
.messageId(UUID.randomUUID().toString()).build();
81+
MessageHeaders headers = mapper.toHeaders(message);
82+
assertThat(headers.get(headerName)).isEqualTo(headerValue);
83+
}
84+
85+
@Test
86+
void shouldDefaultToStringIfDataTypeUnknownMessageAttributes() {
5787
SqsHeaderMapper mapper = new SqsHeaderMapper();
5888
String headerName = "stringAttribute";
5989
String headerValue = "myString";
6090
Message message = Message.builder().body("payload")
6191
.messageAttributes(
6292
Map.of(headerName,
63-
MessageAttributeValue.builder().dataType(MessageAttributeDataTypes.STRING)
93+
MessageAttributeValue.builder().dataType("invalid data type")
6494
.stringValue(headerValue).build()))
6595
.messageId(UUID.randomUUID().toString()).build();
6696
MessageHeaders headers = mapper.toHeaders(message);
@@ -69,13 +99,28 @@ void shouldAddStringMessageAttributes() {
6999

70100
@Test
71101
void shouldAddBinaryMessageAttributes() {
102+
SqsHeaderMapper mapper = new SqsHeaderMapper();
103+
String headerName = "stringAttribute";
104+
SdkBytes headerValue = SdkBytes.fromUtf8String("myString");
105+
Message message = Message.builder().body("payload")
106+
.messageAttributes(
107+
Map.of(headerName,
108+
MessageAttributeValue.builder().dataType(MessageAttributeDataTypes.BINARY)
109+
.binaryValue(headerValue).build()))
110+
.messageId(UUID.randomUUID().toString()).build();
111+
MessageHeaders headers = mapper.toHeaders(message);
112+
assertThat(headers.get(headerName)).isEqualTo(headerValue);
113+
}
114+
115+
@Test
116+
void shouldAddBinaryCustomMessageAttributes() {
72117
SqsHeaderMapper mapper = new SqsHeaderMapper();
73118
String headerName = "stringAttribute";
74119
SdkBytes headerValue = SdkBytes.fromUtf8String("myString");
75120
Message message = Message.builder().body("payload")
76121
.messageAttributes(
77122
Map.of(headerName,
78-
MessageAttributeValue.builder().dataType(MessageAttributeDataTypes.BINARY)
123+
MessageAttributeValue.builder().dataType(MessageAttributeDataTypes.BINARY + ".protobuf")
79124
.binaryValue(headerValue).build()))
80125
.messageId(UUID.randomUUID().toString()).build();
81126
MessageHeaders headers = mapper.toHeaders(message);

0 commit comments

Comments
 (0)