- はじめに
- Web アプリケーションで WebSocketエンドポイントにプログラムコードでリクエストをディスパッチ可能となった
- Websocketクライアントのクライアント証明の設定が可能となった
- JPMS モジュールディスクリプタの追加
- その他の変更点
はじめに
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.websocket
と jakarta.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.websocket
は jakarta.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 であり、それ以前のリダイレクトされたリクエストがある場合はその限りではない。
- JavaDoc に以下が追記された
タイムアウトの設定でゼロまたは負の値を設定時の挙動が明確化された
Session
WebSocketContainer
RemoteEndpoint
の各メソッドのJavaDocにゼロまたは負の値を設定した場合にタイムアウトしない旨が追記された
Session.addMessageHandler() などで MessageHandler が変更された場合の挙動が明確化された
- メッセージに対する MessageHandler を特定した時点のものが継続して使用される旨が明記された