From 6dd5c85ed03167f80879c6f582e5e0d35b413f0c Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Tue, 25 Jun 2024 21:16:50 +0200 Subject: [PATCH] Support byte array payloads in ProtobufMessageConverter Prior to this commit, the `ProtobufMessageConverter` used in messaging would try and serialize the message payload by calling "toString()" on it in order to pass it to the Protobuf JSON encoder. While this works for `String` payloads, this fails for `byte[]` types. This commit ensures that such `byte[]` are first converted to `String` instances using the given charset first. Fixes gh-27408 --- .../messaging/converter/ProtobufMessageConverter.java | 9 +++++++-- .../converter/ProtobufMessageConverterTests.java | 11 ++++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/spring-messaging/src/main/java/org/springframework/messaging/converter/ProtobufMessageConverter.java b/spring-messaging/src/main/java/org/springframework/messaging/converter/ProtobufMessageConverter.java index 45bc4d0f1a..bab066d23b 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/converter/ProtobufMessageConverter.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/converter/ProtobufMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2024 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. @@ -265,7 +265,12 @@ public class ProtobufMessageConverter extends AbstractMessageConverter { throws IOException, MessageConversionException { if (contentType.isCompatibleWith(APPLICATION_JSON)) { - this.parser.merge(message.getPayload().toString(), builder); + if (message.getPayload() instanceof byte[] bytes) { + this.parser.merge(new String(bytes, charset), builder); + } + else { + this.parser.merge(message.getPayload().toString(), builder); + } } else { throw new MessageConversionException( diff --git a/spring-messaging/src/test/java/org/springframework/messaging/converter/ProtobufMessageConverterTests.java b/spring-messaging/src/test/java/org/springframework/messaging/converter/ProtobufMessageConverterTests.java index 508a462516..a936428752 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/converter/ProtobufMessageConverterTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/converter/ProtobufMessageConverterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2024 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. @@ -16,6 +16,7 @@ package org.springframework.messaging.converter; +import java.nio.charset.StandardCharsets; import java.util.Map; import org.junit.jupiter.api.Test; @@ -49,14 +50,14 @@ class ProtobufMessageConverterTests { private Message messageWithoutContentType = MessageBuilder.withPayload(this.testMsg.toByteArray()).build(); - private final Message messageJson = MessageBuilder.withPayload(""" + private final Message messageJson = MessageBuilder.withPayload(""" { "foo": "Foo", "blah": { "blah": 123 } } - """) + """.getBytes(StandardCharsets.UTF_8)) .setHeader(CONTENT_TYPE, APPLICATION_JSON) .build(); @@ -113,10 +114,10 @@ class ProtobufMessageConverterTests { Message message = converter.toMessage(testMsg, new MessageHeaders(Map.of(CONTENT_TYPE, APPLICATION_JSON))); assertThat(message).isNotNull(); assertThat(message.getHeaders().get(CONTENT_TYPE)).isEqualTo(APPLICATION_JSON); - JSONAssert.assertEquals(messageJson.getPayload(), message.getPayload().toString(), true); + JSONAssert.assertEquals(new String(messageJson.getPayload()), message.getPayload().toString(), true); //convertFrom - assertThat(converter.fromMessage(message, Msg.class)).isEqualTo(testMsg); + assertThat(converter.fromMessage(messageJson, Msg.class)).isEqualTo(testMsg); } }