我不确定这是否适合您的架构,但我通过使用 Spring Boot 的 STOMP 支持并将其连接到 customorg.eclipse.lsp4j.jsonrpc.RemoteEndpoint
而不是使用较低级别的 API 来实现这一点。
该方法的灵感来自于通读org.eclipse.lsp4j.launch.LSPLauncher
.
JSON 处理程序
编组和解组 JSON 需要使用 xtext 语言服务器提供的 API,而不是 Jackson(Spring STOMP 集成将使用)
Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<String, JsonRpcMethod>();
supportedMethods.putAll(ServiceEndpoints.getSupportedMethods(LanguageClient.class));
supportedMethods.putAll(languageServer.supportedMethods());
jsonHandler = new MessageJsonHandler(supportedMethods);
jsonHandler.setMethodProvider(remoteEndpoint);
响应/通知
响应和通知由消息使用者发送,该消息使用者remoteEndpoint
在构造时传递给该消息使用者。该消息必须由该消息进行编组,jsonHandler
以防止杰克逊这样做。
remoteEndpoint = new RemoteEndpoint(new MessageConsumer() {
@Override
public void consume(Message message) {
simpMessagingTemplate.convertAndSendToUser('user', '/lang/message',
jsonHandler.serialize(message));
}
}, ServiceEndpoints.toEndpoint(languageServer));
要求
@MessageMapping
可以使用一种将整体@Payload
作为 a的方法来接收请求,String
以避免 Jackson 解组它。然后,您可以解组自己并将消息传递给remoteEndpoint
.
@MessageMapping("/lang/message")
public void incoming(@Payload String message) {
remoteEndpoint.consume(jsonHandler.parseMessage(message));
}
可能有更好的方法来做到这一点,我会感兴趣地关注这个问题,但这是我发现的一种方法。