当前位置: 首页 > 知识库问答 >
问题:

JSF 2.3无法通过Tomcat 9支持WebSocket

凤修筠
2023-03-14

我尝试用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那么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个答案

满言
2023-03-14

javax.websocket.部署异常:多个endpoint可能无法部署到同一路径[/javax.faces.push/{通道}]:现有endpoint是[类com.sun.faces.push.WebSocketEndpoint],新endpoint是org.apache.tomcat.websocket.server.WsServerContainer.addendpoint(WsServerContainer.java:169)I的[类com.sun.faces.push.WebSocketEndpoint]

当运行时类路径被多个Mojarra实现污染时,就会发生这种情况。例如,一个来自< code>jsf-impl.jar文件,另一个来自< code>javax.faces.jar文件。或者甚至可能是多个不同版本。

您需要确保运行时类路径中只有一个版本的库。这并不特别适用于Mojarra,而是适用于每个基于Java的库。

Mojarra的安装说明可以在其自述文件中找到。

 类似资料:
  • 我正在尝试使用NetBeans(或任何IDE)开发JavaFX应用程序,但我无法正确安装JDK和JavaFX。 对于上下文,我使用Ubuntu 18.04 LTS,并遵循本指南。目前,当运行时,我得到以下输出: 这不是我想要使用的JDK。我已经从这个网站下载了JDK15,打开了tar。gz文件,并将其放入名为的文件夹中的。提取文件夹后,我将JDK添加到我的系统路径变量中: 然后是系统重启。在Net

  • 尝试在使用Spring cloud Gateway代理soap服务时记录请求和响应。下面是代码段...它引发IllegalStateException。 IllegalStateException:只允许一个连接接收订阅服务器。在reactor.netty.channel.fluxreceive.startreceive(fluxreceive.java:271)[reactor-nety.cha

  • 问题内容: 以下是我运行时遇到的错误: 问题答案: 在没有空格的路径中创建您的virtualenv环境。这就是为什么它发生的原因: 创建环境时,它会建立一个目录。在该目录中是与环境有关的所有可执行文件。有些是脚本。如您所知,hashbang用来告诉系统使用什么解释程序来运行脚本。您可能经常在脚本顶部看到此信息: 如果脚本位于,则告诉系统运行以下命令来执行脚本: 就您而言,virtualenv正在创

  • 我有一个maven项目。它是用Java 16编写的。我安装了Java 16 JDK。 当我用dockerfile构建它时,一切都正常,但当我运行docker并转到我的项目url时,我得到了一个“不受支持的类文件主版本60”。 可以在tomcat或其他东西上运行java 16项目吗? 这是我的一些文件: DockerFile文件: 还有我的pom。xml: Tomcat日志: docker执行后从a

  • 问题内容: 我有一个由某些客户端提供的基于Java的应用程序。当我尝试运行该应用程序时,我遇到错误,当我联系客户端时,他们只是要求用8更新JCE , 我做了以下步骤 从Oracle JCE下载站点下载软件。 解压缩该软件包并将文件local_policy.jar和US_export_policy.jar复制到JRE安全库中。 JRE-C:\ Program Files \ Java \ jre1.

  • 如何将Tomcat9的内部日志记录(catalina和localhost)重定向到log4j2? 虽然Tomcat和Log4j的旧版本有很多指南,但我找不到任何关于Tomcat 9和Log4J2的“完整”指南;Apache Tomcat 9文档指向“替代日志框架提供的说明”,Apache Log4j文档说明(2.更正的jar名称): Log4j可以用作Apache Tomcat的日志记录框架。这种