Closed
Description
Affects: spring-messaging:5.1.8.REALEASE
Setup:
WebSocketStompClient client = new WebSocketStompClient(new JettyWebSocketClient(webSockClient));
client.setMessageConverter(new ByteArrayMessageConverter());
StompSession ses = client.connect(cfg.serverUri() + AGENTS_PATH, new AfterConnectedSessionHandler());
ses.send("/app/some/destination", new byte[]{-37,75,0,0,1,0,24});
Result after message receive without correct content-type header
@MessageMapping("/app/some/destination")
public void data(byte[] data) {}
After receive message, data is equals: new byte[]{-17, -65, -67, 75, 0, 0, 1}
Result after message receive with correct content-type header
StompHeaders headers = new StompHeaders();
headers.setContentType(MimeTypeUtils.APPLICATION_OCTET_STREAM);
headers.setDestination("/app/some/destination");
ses.send(headers, new byte[]{-37,75,0,0,1,0,24});
After send message with content-type we receive correct byte array on server side.
The root cause here:
private Message<byte[]> createMessage(StompHeaderAccessor accessor, Object payload) {
accessor.updateSimpMessageHeadersFromStompHeaders();
Message<byte[]> message;
if (payload == null) {
message = MessageBuilder.createMessage(EMPTY_PAYLOAD, accessor.getMessageHeaders());
}
// WE DON'T CALL ByteArrayMessageConverter :(
else if (payload instanceof byte[]) {
message = MessageBuilder.createMessage((byte[]) payload, accessor.getMessageHeaders());
}
else {
message = (Message<byte[]>) getMessageConverter().toMessage(payload, accessor.getMessageHeaders());
accessor.updateStompHeadersFromSimpMessageHeaders();
if (message == null) {
throw new MessageConversionException("Unable to convert payload with type='" +
payload.getClass().getName() + "', contentType='" + accessor.getContentType() +
"', converter=[" + getMessageConverter() + "]");
}
}
return message;
}