Spring boot SpringBoot从websocket获取InputStream和OutputStream
我们希望将第三方库(EclipseXTextLSP)集成到我们的SpringBootWebApp中 此库与用户“交互”工作(如聊天)。XTEXTAPI需要输入和输出流才能工作。我们希望使用WebSocket让用户能够顺利地与这个库交互(发送/检索json消息) SpringBoot有一个问题,因为SpringBoot对WebSocket的支持没有公开输入/输出流。我们编写了自定义TextWebSocketHandler(子类),但它的任何方法都不提供对输入/输出流的访问 我们还尝试使用握手Interceptor(在握手后获取输入/输出流),但没有成功 我们可以在这个场景中使用SpringBoot WebSocket API,还是应该使用一些较低级别(Servlet?)的APISpring 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
关于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));
}