Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot SpringBoot从websocket获取InputStream和OutputStream_Spring Boot_Websocket_Xtext_Language Server Protocol - Fatal编程技术网

Spring boot SpringBoot从websocket获取InputStream和OutputStream

Spring boot SpringBoot从websocket获取InputStream和OutputStream,spring-boot,websocket,xtext,language-server-protocol,Spring Boot,Websocket,Xtext,Language Server Protocol,我们希望将第三方库(EclipseXTextLSP)集成到我们的SpringBootWebApp中 此库与用户“交互”工作(如聊天)。XTEXTAPI需要输入和输出流才能工作。我们希望使用WebSocket让用户能够顺利地与这个库交互(发送/检索json消息) SpringBoot有一个问题,因为SpringBoot对WebSocket的支持没有公开输入/输出流。我们编写了自定义TextWebSocketHandler(子类),但它的任何方法都不提供对输入/输出流的访问 我们还尝试使用握手Int

我们希望将第三方库(EclipseXTextLSP)集成到我们的SpringBootWebApp中

此库与用户“交互”工作(如聊天)。XTEXTAPI需要输入和输出流才能工作。我们希望使用WebSocket让用户能够顺利地与这个库交互(发送/检索json消息)

SpringBoot有一个问题,因为SpringBoot对WebSocket的支持没有公开输入/输出流。我们编写了自定义TextWebSocketHandler(子类),但它的任何方法都不提供对输入/输出流的访问

我们还尝试使用握手Interceptor(在握手后获取输入/输出流),但没有成功

我们可以在这个场景中使用SpringBoot WebSocket API,还是应该使用一些较低级别(Servlet?)的API


关于Daniel,我不确定这是否适合您的体系结构,但我通过使用Spring Boot的STOMP支持并将其连接到自定义的
org.eclipse.lsp4j.jsonrpc.RemoteEndpoint
,而不是使用较低级别的API,实现了这一点

这种方法的灵感来自于阅读
org.eclipse.lsp4j.launch.LSPLauncher
中提供的代码

JSON处理程序

JSON的Marhalling和unmarshalling需要使用随xtext语言服务器提供的API来完成,而不是Jackson(Spring STOMP集成将使用Jackson)

请求

可以使用
@MessageMapping
方法接收请求,该方法将整个
@Payload
作为
字符串,以避免Jackson将其解组。然后,您可以自行解组并将消息传递到
remoteEndpoint

@MessageMapping("/lang/message")
public void incoming(@Payload String message) {
   remoteEndpoint.consume(jsonHandler.parseMessage(message));
}

也许有更好的方法可以做到这一点,我将饶有兴趣地关注这个问题,但我发现这是一种行之有效的方法。

WebSocket不会流式处理。API支持输入和输出流,但仅支持每个WS消息。在引擎盖下,你仍然在写带边框的信息。
remoteEndpoint = new RemoteEndpoint(new MessageConsumer() {
    @Override
    public void consume(Message message) { 
        simpMessagingTemplate.convertAndSendToUser('user', '/lang/message',
            jsonHandler.serialize(message));
    }
}, ServiceEndpoints.toEndpoint(languageServer));
@MessageMapping("/lang/message")
public void incoming(@Payload String message) {
   remoteEndpoint.consume(jsonHandler.parseMessage(message));
}