Introduce Jackson 3 support for spring-websocket

This commit introduces a JacksonJsonSockJsMessageCodec Jackson 3 variant
of Jackson2SockJsMessageCodec.

See gh-33798
This commit is contained in:
Sébastien Deleuze
2025-05-13 12:58:20 +02:00
parent a0ed3f052e
commit ac3c1b8762
12 changed files with 110 additions and 31 deletions

View File

@@ -29,7 +29,7 @@ import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketExtension;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.sockjs.frame.Jackson2SockJsMessageCodec;
import org.springframework.web.socket.sockjs.frame.JacksonJsonSockJsMessageCodec;
import org.springframework.web.socket.sockjs.frame.SockJsFrame;
import org.springframework.web.socket.sockjs.transport.TransportType;
@@ -48,7 +48,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
*/
class ClientSockJsSessionTests {
private static final Jackson2SockJsMessageCodec CODEC = new Jackson2SockJsMessageCodec();
private static final JacksonJsonSockJsMessageCodec CODEC = new JacksonJsonSockJsMessageCodec();
private WebSocketHandler handler = mock();

View File

@@ -30,7 +30,7 @@ import org.mockito.ArgumentCaptor;
import org.springframework.http.HttpHeaders;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.sockjs.frame.Jackson2SockJsMessageCodec;
import org.springframework.web.socket.sockjs.frame.JacksonJsonSockJsMessageCodec;
import org.springframework.web.socket.sockjs.transport.TransportType;
import static org.assertj.core.api.Assertions.assertThat;
@@ -47,7 +47,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
*/
class DefaultTransportRequestTests {
private final Jackson2SockJsMessageCodec CODEC = new Jackson2SockJsMessageCodec();
private final JacksonJsonSockJsMessageCodec CODEC = new JacksonJsonSockJsMessageCodec();
private CompletableFuture<WebSocketSession> connectFuture = new CompletableFuture<>();

View File

@@ -50,7 +50,7 @@ import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.sockjs.frame.Jackson2SockJsMessageCodec;
import org.springframework.web.socket.sockjs.frame.JacksonJsonSockJsMessageCodec;
import org.springframework.web.socket.sockjs.frame.SockJsFrame;
import org.springframework.web.socket.sockjs.transport.TransportType;
@@ -69,7 +69,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
*/
class RestTemplateXhrTransportTests {
private static final Jackson2SockJsMessageCodec CODEC = new Jackson2SockJsMessageCodec();
private static final JacksonJsonSockJsMessageCodec CODEC = new JacksonJsonSockJsMessageCodec();
private final WebSocketHandler webSocketHandler = mock();
@@ -114,7 +114,7 @@ class RestTemplateXhrTransportTests {
Message<byte[]> message = MessageBuilder.createMessage("body".getBytes(UTF_8), headers);
byte[] bytes = new StompEncoder().encode(message);
TextMessage textMessage = new TextMessage(bytes);
SockJsFrame frame = SockJsFrame.messageFrame(new Jackson2SockJsMessageCodec(), textMessage.getPayload());
SockJsFrame frame = SockJsFrame.messageFrame(new JacksonJsonSockJsMessageCodec(), textMessage.getPayload());
String body = """
o

View File

@@ -49,7 +49,7 @@ class SockJsFrameTests {
@Test
void messageArrayFrame() {
SockJsFrame frame = SockJsFrame.messageFrame(new Jackson2SockJsMessageCodec(), "m1", "m2");
SockJsFrame frame = SockJsFrame.messageFrame(new JacksonJsonSockJsMessageCodec(), "m1", "m2");
assertThat(frame.getContent()).isEqualTo("a[\"m1\",\"m2\"]");
assertThat(frame.getType()).isEqualTo(SockJsFrameType.MESSAGE);

View File

@@ -18,7 +18,7 @@ package org.springframework.web.socket.sockjs.transport.session;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.web.socket.sockjs.frame.Jackson2SockJsMessageCodec;
import org.springframework.web.socket.sockjs.frame.JacksonJsonSockJsMessageCodec;
import org.springframework.web.socket.sockjs.frame.SockJsMessageCodec;
import org.springframework.web.socket.sockjs.transport.SockJsServiceConfig;
@@ -33,7 +33,7 @@ public class StubSockJsServiceConfig implements SockJsServiceConfig {
private TaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
private SockJsMessageCodec messageCodec = new Jackson2SockJsMessageCodec();
private SockJsMessageCodec messageCodec = new JacksonJsonSockJsMessageCodec();
private int httpMessageCacheSize = 100;

View File

@@ -16,13 +16,13 @@
package org.springframework.web.socket.sockjs.transport.session;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import tools.jackson.core.JacksonException;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
@@ -118,7 +118,7 @@ class WebSocketServerSockJsSessionTests extends AbstractSockJsSessionTests<TestW
this.session.handleMessage(message, this.webSocketSession);
this.session.isClosed();
verify(this.webSocketHandler).handleTransportError(same(this.session), any(IOException.class));
verify(this.webSocketHandler).handleTransportError(same(this.session), any(JacksonException.class));
verifyNoMoreInteractions(this.webSocketHandler);
}