0

サードパーティのライブラリ (Eclipse XText LSP) を SpringBoot Web アプリケーションに統合したいと考えています。

このライブラリは、ユーザーと「対話的に」機能します (チャットのように)。XText API が機能するには、入力ストリームと出力ストリームが必要です。WebSocket を使用して、ユーザーがこのライブラリをスムーズに操作できるようにしたいと考えています (json メッセージの送信/取得)。

WebSocket の SpringBoot サポートは入力/出力ストリームを公開しないため、SpringBoot に問題があります。カスタムの TextWebSocketHandler (サブクラス) を作成しましたが、そのメソッドのいずれもイン/アウト ストリームへのアクセスを提供しません。

また、HandshakeInterceptor (ハンドシェイク後にイン/アウト ストリームを取得するため) も試しましたが、成功しませんでした。

このシナリオで SpringBoot WebSocket API を使用できますか、それとも低レベル (サーブレット?) API を使用する必要がありますか?

よろしくダニエル

4

1 に答える 1

1

これがあなたのアーキテクチャに適合するかどうかはわかりませんが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構築時に に渡されます。jsonHandlerJackson がそれを行うのを防ぐために、メッセージは によってマーシャリングされなければなりません。

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));
}

これを行うためのより良い方法があるかもしれません。私はこの質問を興味深く見ますが、これは私がうまくいくことがわかったアプローチです。

于 2018-06-18T09:35:00.350 に答える