JSF 2.3.3 (Glassfish 実装) で新しい WebSocket 機能をテストしようとしました。Tomcat 9.0.1 を Web サーバーとして使用し、このガイド ( https://javaserverfaces.github.io/whats-new-in-jsf23.html )に従いました。
マネージド Bean を作成しました。
@Named
@ApplicationScoped
public class Controller {
@Inject @Push
private PushContext cityChannel;
public void send() {
cityChannel.send("test");
}
}
更新された index.xhtml:
<f:websocket channel="cityChannel"
onmessage="function(message){alert(message)}" />
更新された web.xml:
<context-param>
<param-name>javax.faces.ENABLE_CDI_RESOLVER_CHAIN</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>javax.faces.ENABLE_WEBSOCKET_ENDPOINT</param-name>
<param-value>true</param-value>
</context-param>
残念ながら、Tomcat は次のエラーでアプリケーションをロードできませんでした:
SEVERE [main] com.sun.faces.config.ConfigureListener.contextInitialized Critical error during deployment:
javax.websocket.DeploymentException: Multiple Endpoints may not be deployed to the same path [/javax.faces.push/{channel}] : existing endpoint was [class com.sun.faces.push.WebsocketEndpoint] and new endpoint is [class com.sun.faces.push.WebsocketEndpoint]
at org.apache.tomcat.websocket.server.WsServerContainer.addEndpoint(WsServerContainer.java:169)
コンテキスト パラメータ javax.faces.ENABLE_WEBSOCKET_ENDPOINT を削除すると、index.xhtml にヒットしたときに JSF ランタイムでエラーが発生します。
Caused by: java.lang.IllegalStateException: f:websocket endpoint is not enabled. You need to set web.xml context param 'javax.faces.ENABLE_WEBSOCKET_ENDPOINT' with value 'true'.
お知らせ下さい。