これがあなたのアーキテクチャに適合するかどうかはわかりませんがorg.eclipse.lsp4j.jsonrpc.RemoteEndpoint
、低レベルの API を使用するのではなく、Spring Boot の STOMP サポートを使用して custom に接続することでこれを達成しました。
このアプローチは、 で提供されているコードを読んで着想を得たものorg.eclipse.lsp4j.launch.LSPLauncher
です。
JSON ハンドラー
JSON のマーシャリングとアンマーシャリングは、Jackson (Spring STOMP 統合で使用される) ではなく、xtext 言語サーバーで提供される API を使用して行う必要があります。
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
Jackson がそれを行うのを防ぐために、メッセージは によってマーシャリングされなければなりません。
remoteEndpoint = new RemoteEndpoint(new MessageConsumer() {
@Override
public void consume(Message message) {
simpMessagingTemplate.convertAndSendToUser('user', '/lang/message',
jsonHandler.serialize(message));
}
}, ServiceEndpoints.toEndpoint(languageServer));
リクエスト
Jackson がアンマーシャリングするのを避けるために@MessageMapping
、全体@Payload
を として受け取るメソッドを使用して、リクエストを受け取ることができます。String
次に、自分自身をアンマーシャリングして、メッセージを に渡すことができますremoteEndpoint
。
@MessageMapping("/lang/message")
public void incoming(@Payload String message) {
remoteEndpoint.consume(jsonHandler.parseMessage(message));
}
これを行うためのより良い方法があるかもしれません。私はこの質問を興味深く見ますが、これは私がうまくいくことがわかったアプローチです。