Jakarta EE 10 - Jakarta WebSocket 2.1 変更内容まとめ

blog1.mammb.com


はじめに

Jakarta EE 10 で Jakarta WebSocket は 2.0 から 2.1 へバージョンアップします。

マイナーチェンジのため、大きなインパクトのある変更はありません。


Web アプリケーションで WebSocketエンドポイントにプログラムコードでリクエストをディスパッチ可能となった

Jakarta Web コンテナ環境では、Web アプリケーションのデプロイ時にのみエンドポイントが登録できるという制限がありました。

この制限が仕様上解除されたと共に、ServerContainer インターフェースに以下のメソッドが追加されました。

public interface ServerContainer extends WebSocketContainer {
  public void upgradeHttpToWebSocket(
    Object httpServletRequest, Object httpServletResponse, ServerEndpointConfig sec,
    Map<String,String> pathParameters) throws IOException, DeploymentException;
}

このメソッドにて、HTTP接続を WebSocket プロトコルにアップグレードして WebSocket 接続を確立することができます。

なお、このメソッドにより、エンドポイントがデプロイされる訳ではなく、主にフロントコントローラパターンを実装するフレームワークで使用されることが想定されています。


Websocketクライアントのクライアント証明の設定が可能となった

ClientEndpointConfig に以下のメソッドが追加されました。

public interface ClientEndpointConfig extends EndpointConfig {

  SSLContext getSSLContext();

  // ...

  public final class Builder {
    // ...
    public ClientEndpointConfig.Builder sslContext(SSLContext sslContext) {
      this.sslContext = sslContext;
      return this;
    }
  }
}

Builder を経由して SSLContext のプロビジョニングが可能となっています。


JPMS モジュールディスクリプタの追加

jakarta.websocketjakarta.websocket.client の2つの JPMS module descriptors が追加されました。

module jakarta.websocket {
    exports jakarta.websocket.server;

    requires transitive jakarta.websocket.client;

    uses jakarta.websocket.server.ServerEndpointConfig.Configurator;
}
module jakarta.websocket.client {
    exports jakarta.websocket;

    uses jakarta.websocket.ContainerProvider;
}

jakarta.websocketjakarta.websocket.client に依存する形になります。


その他の変更点

  • Session#getUserProperties() はユーザプロパティのセッション毎の shallow copy を返すことが明記された

    • @OnOpen 時や、ServerEndpointConfig.Configurator#modifyHandshake() で共有されたユーザープロパティとして利用可能になった
  • ServerEndpointConfig#getContainerDefaultConfigurator() の公開

    • ServerEndpointConfig#getContainerDefaultConfigurator() はパッケージプライベートであった
    • CDI Bean の @PreDestroy 呼び出しのためにパブリックメソッドに変更された
  • Session#getRequestURI() の振る舞いの明確化

    • JavaDoc に以下が追記された

      このセッションが開かれた URI を、プロトコルからクエリ文字列(存在する場合)まで全て返します。この URI は、プロトコルを {@code ws} または {@code wss} に適切に変更する以外は、WebSocket にアップグレードした HTTP リクエストに使用した完全な URI と同じであるべきです。この値の基礎として使用されるのは、{@code 101 Switching Protocols} 応答を受け取った HTTP リクエストに関連付けられた URI であり、それ以前のリダイレクトされたリクエストがある場合はその限りではない。

  • タイムアウトの設定でゼロまたは負の値を設定時の挙動が明確化された

    • Session WebSocketContainer RemoteEndpoint の各メソッドのJavaDocにゼロまたは負の値を設定した場合にタイムアウトしない旨が追記された
  • Session.addMessageHandler() などで MessageHandler が変更された場合の挙動が明確化された

    • メッセージに対する MessageHandler を特定した時点のものが継続して使用される旨が明記された