Я пытаюсь настроить обработчик WebSocket для моего приложения Java 21 Spring Boot 3.2. Это приложение MVC, и WebSocket должен обрабатывать подпротокол Graphql-ws.
Я использую Postman для подключения к WebSocket, но когда я пытаюсь подключиться, соединение немедленно закрывается.
Открытое сообщение в Postman:
Connected to ws://localhost:8080/ws
Handshake Details
Request URL: http://localhost:8080/ws
Request Method: GET
Status Code: 101
Request Headers
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: mzmZ6oZ2ElvK0A7Sz9Fs0g==
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Protocol: graphql-ws
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Host: localhost:8080
Response Headers
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: WHyBhldM6qYKH+Zu0qZlcrfIujY=
Sec-WebSocket-Protocol: graphql-ws
Sec-WebSocket-Extensions: permessage-deflate;client_max_window_bits=15
Date: Thu, 09 May 2024 18:13:59 GMT
Закрытое сообщение в Postman:
Disconnected from ws://localhost:8080/ws
12:13:59
4400 Error: Invalid message
Вот мой класс конфигурации:
@Configuration
@EnableWebSocket
public class WebsocketConfig implements WebSocketConfigurer {
private final MyWebSocketHandler myWebSocketHandler;
public WebsocketConfig(MyWebSocketHandler myWebSocketHandler) {
this.myWebSocketHandler = myWebSocketHandler;
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myWebSocketHandler, "/ws").setAllowedOrigins("*");
}
}
Мой класс обработчика:
@Controller
public class MyWebSocketHandler extends GraphQlWebSocketHandler {
Logger logger = LoggerFactory.getLogger(MyWebSocketHandler.class);
public MyWebSocketHandler(@Qualifier("mappingJackson2HttpMessageConverter") HttpMessageConverter converter,
WebGraphQlHandler graphQlHandler) {
super(graphQlHandler, converter, Duration.ofSeconds(5));
}
@Override
public void afterConnectionEstablished(@NonNull WebSocketSession session) {
logger.info("Handle after connection established for session {}", session.getId());
super.afterConnectionEstablished(session);
}
@Override
public void handleMessage(@NonNull WebSocketSession session, @NonNull WebSocketMessage message) throws Exception {
logger.info("Handle message for session {}: {}", session.getId(), message.getPayload());
super.handleMessage(session, message);
}
@Override
public void handleTransportError(@NonNull WebSocketSession session, @NonNull Throwable exception) {
logger.info("Handle transport error for session {}: {}",session.getId(), exception.getMessage());
super.handleTransportError(session, exception);
}
@Override
public void afterConnectionClosed(@NonNull WebSocketSession session, @NonNull CloseStatus closeStatus) {
logger.info("Handle after connection closed for session {}: {}:{}", session.getId(), closeStatus.getCode(), closeStatus.getReason());
super.afterConnectionClosed(session, closeStatus);
}
}
Этот набор есть в моем приложении.yaml:
spring:
graphql:
websocket:
path: /ws
Я получаю эти два журнала из класса Handler:
2024-05-09T12:37:59.034Z INFO c.m.c.MyWebSocketHandler - Handle after connection established for session 846edb0f-7b5d-b19e-e652-1417884e0d52
2024-05-09T12:37:59.034Z INFO c.m.c.MyWebSocketHandler - Handle after connection closed for session 846edb0f-7b5d-b19e-e652-1417884e0d52: 4400:Invalid message
Мои зависимости:
implementation "org.springframework.boot:spring-boot-starter-graphql:3.2.0"
implementation "org.springframework.boot:spring-boot-starter-web:3.2.0"
implementation "org.springframework.boot:spring-boot-starter-websocket:3.2.0"
В Postman я пытаюсь использовать как «Подключение», так и отправку сообщения «connection_init»:
{
"type": "connection_init",
"payload": {
"token": "{{jwt}}"
}
}
Я запускаю приложение локально и пробовал следующее:
localhost:8080/ws
ws://localhost:8080/ws
Почему мой WebSocket немедленно закрывается? Почему «сообщение» недействительно?
Кроме того, приложение использует MVC (для других API), поэтому WebFlux не используется.
Спасибо
Изменить:
Я обнаружил, что соединение работает, если я удалю Sec-WebSocket-Protocol:graphql-ws из своих заголовков... но мне нужно это поддержать подпротокол...
Без подпротокола я получаю эту ошибку, когда пытаюсь отправить сообщение о подписке GraphQL:
1011 Server Error: Internal server error while operating.
Вот сообщение о моей подписке:
{
"id": "{myId}",
"type": "start",
"payload": {
"query": "{my graphql query}"
}
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... er-opening
Java Spring Boot GraphQL WebSocket закрывается сразу после открытия ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение