Skip to content

Commit 36c5de7

Browse files
authored
fix(core): allow to publish with different jackson naming strategies (#1563)
1 parent 1fe0977 commit 36c5de7

File tree

10 files changed

+181
-107
lines changed

10 files changed

+181
-107
lines changed

springwolf-core/src/main/java/io/github/springwolf/core/controller/PublishingPayloadCreator.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public class PublishingPayloadCreator {
3030
private final ObjectMapper objectMapper;
3131

3232
public Result createPayloadObject(MessageDto message) {
33-
String messagePayloadType = message.getPayloadType();
33+
String messageType = message.getType();
3434

3535
if (MessageDto.EMPTY.equals(message.getPayload())) {
3636
return new Result(null, Optional.empty());
@@ -44,7 +44,7 @@ public Result createPayloadObject(MessageDto message) {
4444
SchemaObject schema = componentSchema.getSchema();
4545

4646
// security: match against user input, but always use our controlled data from the DefaultSchemaService
47-
if (schemaName != null && schemaName.equals(messagePayloadType)) {
47+
if (schemaName != null && schemaName.equals(messageType)) {
4848
try {
4949
Object payload = resolveActualPayload(message, schema, schemaName);
5050
return new Result(payload, Optional.empty());
@@ -57,10 +57,10 @@ public Result createPayloadObject(MessageDto message) {
5757
}
5858
}
5959

60-
String errorMessage = MessageFormat.format(
61-
"Specified payloadType {0} is not a registered springwolf schema.", messagePayloadType);
60+
String errorMessage =
61+
MessageFormat.format("Specified type {0} is not a registered springwolf schema.", messageType);
6262
String knownPayloadsMessage =
63-
MessageFormat.format(" Known payloadTypes: [{0}]", StringUtils.join(knownSchemaNames, ", "));
63+
MessageFormat.format(" Known types: [{0}]", StringUtils.join(knownSchemaNames, ", "));
6464
log.info("{}{}", errorMessage, knownPayloadsMessage);
6565
return new Result(null, Optional.of(errorMessage));
6666
}

springwolf-core/src/main/java/io/github/springwolf/core/controller/dtos/MessageDto.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
// SPDX-License-Identifier: Apache-2.0
22
package io.github.springwolf.core.controller.dtos;
33

4+
import com.fasterxml.jackson.core.JsonGenerator;
45
import com.fasterxml.jackson.core.JsonParser;
56
import com.fasterxml.jackson.databind.DeserializationContext;
67
import com.fasterxml.jackson.databind.JsonDeserializer;
78
import com.fasterxml.jackson.databind.JsonNode;
9+
import com.fasterxml.jackson.databind.JsonSerializer;
10+
import com.fasterxml.jackson.databind.SerializerProvider;
811
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
12+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
913
import lombok.AllArgsConstructor;
1014
import lombok.Builder;
1115
import lombok.Data;
@@ -26,12 +30,13 @@ public class MessageDto {
2630
private final Map<String, HeaderValue> headers;
2731

2832
@Builder.Default
29-
private final String payloadType = String.class.getCanonicalName();
33+
private final String type = String.class.getCanonicalName();
3034

3135
@Builder.Default
3236
private final String payload = EMPTY;
3337

3438
@JsonDeserialize(using = HeaderValueDeserializer.class)
39+
@JsonSerialize(using = HeaderValueSerializer.class)
3540
public record HeaderValue(String stringValue) {}
3641

3742
public static class HeaderValueDeserializer extends JsonDeserializer<HeaderValue> {
@@ -46,4 +51,17 @@ public HeaderValue deserialize(JsonParser p, DeserializationContext ctxt) throws
4651
return new HeaderValue(node.toString());
4752
}
4853
}
54+
55+
public static class HeaderValueSerializer extends JsonSerializer<HeaderValue> {
56+
@Override
57+
public void serialize(HeaderValue value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
58+
String stringValue = value.stringValue();
59+
try {
60+
double number = Double.parseDouble(stringValue);
61+
gen.writeNumber(number);
62+
} catch (NumberFormatException e) {
63+
gen.writeString(stringValue);
64+
}
65+
}
66+
}
4967
}

springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/controller/dtos/MessageDtoDeserializationTest.java

Lines changed: 0 additions & 32 deletions
This file was deleted.
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
package io.github.springwolf.core.asyncapi.controller.dtos;
3+
4+
import com.fasterxml.jackson.databind.JsonNode;
5+
import com.fasterxml.jackson.databind.ObjectMapper;
6+
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
7+
import com.fasterxml.jackson.databind.node.JsonNodeType;
8+
import io.github.springwolf.core.controller.dtos.MessageDto;
9+
import io.swagger.v3.core.util.Json;
10+
import org.junit.jupiter.api.Test;
11+
12+
import static java.util.Collections.singletonMap;
13+
import static org.assertj.core.api.Assertions.assertThat;
14+
15+
class MessageDtoTest {
16+
private static final ObjectMapper objectMapper = Json.mapper();
17+
18+
@Test
19+
void canBeSerialized() throws Exception {
20+
String content = "{" + "\"headers\": { \"some-header-key\" : \"some-header-value\" }, "
21+
+ "\"payload\": \"{\\\"some-payload-key\\\":\\\"some-payload-value\\\"}\", "
22+
+ "\"type\": \""
23+
+ MessageDto.class.getCanonicalName() + "\"" + "}";
24+
25+
MessageDto value = objectMapper.readValue(content, MessageDto.class);
26+
27+
assertThat(value).isNotNull();
28+
assertThat(value.getHeaders())
29+
.isEqualTo(singletonMap("some-header-key", new MessageDto.HeaderValue("some-header-value")));
30+
assertThat(value.getPayload())
31+
.isEqualTo(
32+
new ObjectMapper().writeValueAsString(singletonMap("some-payload-key", "some-payload-value")));
33+
assertThat(value.getType()).isEqualTo("io.github.springwolf.core.controller.dtos.MessageDto");
34+
}
35+
36+
@Test
37+
void serializationWithDifferentNamingStrategiesIsIndifferent() throws Exception {
38+
// https://github.com/springwolf/springwolf-core/issues/1535
39+
MessageDto messageDto = MessageDto.builder()
40+
.headers(singletonMap("some-header-key", new MessageDto.HeaderValue("some-header-value")))
41+
.payload("some-payload-value")
42+
.type(MessageDto.class.getCanonicalName())
43+
.build();
44+
45+
String expected = objectMapper.writeValueAsString(messageDto);
46+
String actual = objectMapper
47+
.copy()
48+
.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)
49+
.writeValueAsString(messageDto);
50+
51+
assertThat(actual).isEqualTo(expected);
52+
}
53+
54+
@Test
55+
void canDeserializeStringHeaderValue() throws Exception {
56+
// given
57+
String content = "\"12345\"";
58+
59+
// when
60+
MessageDto.HeaderValue value = objectMapper.readValue(content, MessageDto.HeaderValue.class);
61+
62+
// then
63+
assertThat(value).isEqualTo(new MessageDto.HeaderValue("12345"));
64+
}
65+
66+
@Test
67+
void canDeserializeNumericHeaderValue() throws Exception {
68+
// given
69+
String content = "12345";
70+
71+
// when
72+
MessageDto.HeaderValue value = objectMapper.readValue(content, MessageDto.HeaderValue.class);
73+
74+
// then
75+
assertThat(value).isEqualTo(new MessageDto.HeaderValue("12345"));
76+
}
77+
78+
@Test
79+
void canSerializeNumericHeaderValue() throws Exception {
80+
// given
81+
MessageDto.HeaderValue headerValue = new MessageDto.HeaderValue("12345");
82+
83+
// when
84+
JsonNode json = objectMapper.valueToTree(headerValue);
85+
86+
// then
87+
assertThat(json.getNodeType()).isEqualTo(JsonNodeType.NUMBER);
88+
}
89+
}

0 commit comments

Comments
 (0)