JSF 2.3 не поддерживает WebSocket с Tomcat 9

Я попытался протестировать новую функцию WebSocket с JSF 2.3.3(реализация Glassfish). Я использовал Tomcat 9.0.1 в качестве веб-сервера и следовал этому руководству ( https://javaserverfaces.github.io/whats-new-in-jsf23.html)

Я создал управляемый бин:

@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, тогда среда выполнения JSF вызывает ошибку, когда я нажимаю index.xhtml:

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'.

Пожалуйста, порекомендуйте.

1 ответ

javax.websocket.DeploymentException: несколько конечных точек не могут быть развернуты по одному и тому же пути [/javax.faces.push/ndomchannel}]: существующей конечной точкой была [class com.sun.faces.push.WebsocketEndpoint], а новой конечной точкой является [class com.sun.faces.push.WebsocketEndpoint] at org.apache.tomcat.websocket.server.WsServerContainer.addEndpoint(WsServerContainer.java:169) I

Это произойдет, когда путь к классам во время выполнения будет загрязнен несколькими реализациями Mojarra. Например, один из jsf-impl.jar файл и еще один из javax.faces.jar файл. Или, может быть, даже несколько разных версий.

Вы должны убедиться, что у вас есть только одна версия библиотеки в пути к классам во время выполнения. Это относится не только к Mojarra, но и к каждой библиотеке на основе Java.

Инструкции по установке Mojarra можно найти в его README.

Другие вопросы по тегам