Java Spring Boot GraphQL WebSocket закрывается сразу после открытияJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Java Spring Boot GraphQL WebSocket закрывается сразу после открытия

Сообщение Anonymous »

Я пытаюсь настроить обработчик 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»