【问题标题】:Error deploying websocket application on Wildfly在 Wildfly 上部署 websocket 应用程序时出错
【发布时间】:2014-03-02 16:54:58
【问题描述】:

我正在尝试在 Wildfly 上部署一个包含 WebSocket 端点的应用程序,但出现此错误:

javax.websocket.DeploymentException: UT003012: 方法公共无效 Endpoint.openConnection(javax.websocket.Session,javax.websocket.EndpointConfig,java.lang.String) 有无效参数 [2]"}}

这是端点类的代码:

import javax.websocket.EndpointConfig;
import javax.websocket.CloseReason;
import javax.websocket.OnClose;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import javax.ws.rs.PathParam;

@ServerEndpoint(value = "/update-user/{token}")
public class UpdateUsersEndpoint {

    @OnOpen
    public void openConnection(Session session, EndpointConfig config, @PathParam("token") String token) {
        ...
    }

    @OnClose
    public void closedConnection(Session session, CloseReason reason, @PathParam("token") String token) {
        ...
    }
}

这是 Wildfly 日志的完整堆栈:

07:44:31,876 INFO  [io.undertow.websockets.jsr] (MSC service thread 1-4) UT026003: Adding annotated server endpoint class test.UpdateUsersEndpoint for path /update-user/{token}
07:44:31,877 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-4) MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host./test: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./test: Failed to start service
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1904) [jboss-msc-1.2.0.Final.jar:1.2.0.Final]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_51]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_51]
    at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_51]
Caused by: java.lang.RuntimeException: javax.websocket.DeploymentException: UT003012: Method public void test.UpdateUsersEndpoint.openConnection(javax.websocket.Session,javax.websocket.EndpointConfig,java.lang.String) has invalid parameters [2]
    at io.undertow.websockets.jsr.Bootstrap.handleDeployment(Bootstrap.java:50)
    at io.undertow.servlet.core.DeploymentManagerImpl.handleExtensions(DeploymentManagerImpl.java:237)
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:146)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:86)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.start(UndertowDeploymentService.java:71)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948) [jboss-msc-1.2.0.Final.jar:1.2.0.Final]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881) [jboss-msc-1.2.0.Final.jar:1.2.0.Final]
    ... 3 more
Caused by: javax.websocket.DeploymentException: UT003012: Method public void test.UpdateUsersEndpoint.openConnection(javax.websocket.Session,javax.websocket.EndpointConfig,java.lang.String) has invalid parameters [2]
    at io.undertow.websockets.jsr.annotated.BoundMethod.<init>(BoundMethod.java:43)
    at io.undertow.websockets.jsr.annotated.AnnotatedEndpointFactory.create(AnnotatedEndpointFactory.java:81)
    at io.undertow.websockets.jsr.ServerWebSocketContainer.addEndpointInternal(ServerWebSocketContainer.java:266)
    at io.undertow.websockets.jsr.ServerWebSocketContainer.addEndpoint(ServerWebSocketContainer.java:243)
    at io.undertow.websockets.jsr.Bootstrap.handleDeployment(Bootstrap.java:44)
    ... 9 more

删除最后两个参数后部署成功。 由于WebSocket JSR 声明使用@OnOpen 注释的方法可以具有我的方法中的参数,我不明白为什么Wildfly 拒绝部署应用程序。

更新:这是 WEB-INF/lib 文件夹:

activation-1.1.1.jar
apache-mime4j-0.6.jar
asm-3.3.1.jar
commons-email-1.3.1.jar
commons-logging-1.1.1.jar
geronimo-jta_1.1_spec-1.1.1.jar
gson-2.2.2.jar
istack-commons-runtime-2.16.jar
jackson-annotations-2.2.1.jar
jackson-core-2.2.1.jar
jackson-databind-2.2.1.jar
jackson-jaxrs-base-2.2.1.jar
jackson-jaxrs-json-provider-2.2.1.jar
jackson-module-jaxb-annotations-2.2.1.jar
jaxb-api-2.2.7.jar
jaxb-core-2.2.7.jar
jaxb-impl-2.2.7.jar
jboss-annotations-api_1.2_spec-1.0.0.Final.jar
jboss-ejb-api_3.2_spec-1.0.0.Final.jar
jboss-interceptors-api_1.2_spec-1.0.0.Final.jar
jboss-jms-api_2.0_spec-1.0.0.Final.jar
jboss-servlet-api_3.1_spec-1.0.0.Final.jar
jboss-websocket-api_1.0_spec-1.0.0.Final.jar
jcl-over-slf4j-1.7.1.jar
jsr173_api-1.0.jar
logback-classic-1.0.10.jar
logback-core-1.0.10.jar
mail-1.4.5.jar
resteasy-client-3.0.6.Final.jar
resteasy-jackson2-provider-3.0.6.Final.jar
resteasy-jaxb-provider-3.0.6.Final.jar
resteasy-multipart-provider-3.0.6.Final.jar
slf4j-api-1.7.1.jar

【问题讨论】:

  • 你的 WEB-INF/lib 是什么样的?
  • 谢谢@ctomc 我已经编辑了答案,添加了 WEB-INF/lib 文件夹。

标签: jakarta-ee jboss websocket wildfly


【解决方案1】:

您正在使用 javax.ws.rs.PathParam 而不是 javax.websocket.server.PathParam。

我可能会在 Undertow 中添加一个关于此的警告,这似乎是经常发生的事情。

【讨论】:

  • 我已更改上游以查找 JAX-RS 注释,如果存在则抛出更多信息错误消息。
  • 伟大的@Stuart,有时解决方案就在您眼前,但您一直在寻找其他东西。我猜你是 Wildfly 开发者。非常感谢。
【解决方案2】:

您的问题出在错误的库中,您的库中提供了服务器提供的 jar。 这可能会导致各种注射问题。

如果您使用 maven 构建,您的依赖项中只会缺少几个 &lt;scope&gt;provided&lt;/scope&gt;

单个罐子上的cmets:

activation-1.1.1.jar <-- part of jdk, remove
apache-mime4j-0.6.jar 
asm-3.3.1.jar <-- probably not needed
commons-email-1.3.1.jar
commons-logging-1.1.1.jar <-- remove
geronimo-jta_1.1_spec-1.1.1.jar <-- remove this is JTA api jar, it is part of app server
gson-2.2.2.jar
istack-commons-runtime-2.16.jar
jackson-annotations-2.2.1.jar <-- using jackson directly in your app? if not remove jackson*
jackson-core-2.2.1.jar
jackson-databind-2.2.1.jar
jackson-jaxrs-base-2.2.1.jar
jackson-jaxrs-json-provider-2.2.1.jar
jackson-module-jaxb-annotations-2.2.1.jar
jaxb-api-2.2.7.jar <-- part of jdk and app server, remove
jaxb-core-2.2.7.jar <-- part of jdk and app server, remove
jaxb-impl-2.2.7.jar <-- part of jdk and app server, remove
jboss-annotations-api_1.2_spec-1.0.0.Final.jar <-- part of app server, should not be in deployment
jboss-ejb-api_3.2_spec-1.0.0.Final.jar <-- part of app server, should not be in deployment
jboss-interceptors-api_1.2_spec-1.0.0.Final.jar <-- part of app server, should not be in deployment
jboss-jms-api_2.0_spec-1.0.0.Final.jar <-- part of app server, should not be in deployment
jboss-servlet-api_3.1_spec-1.0.0.Final.jar <-- part of app server, should not be in deployment
jboss-websocket-api_1.0_spec-1.0.0.Final.jar <-- part of app server, should not be in deployment
jcl-over-slf4j-1.7.1.jar <-- probably not needed as wildfly overrides it
jsr173_api-1.0.jar <-- app server already provides that, could be removed
logback-classic-1.0.10.jar <-- are you server managed logging? if so remove
logback-core-1.0.10.jar <-- are you server managed logging? if so remove
mail-1.4.5.jar <-- part of app server
resteasy-client-3.0.6.Final.jar <-- client api in deployment? is your application client to some jaxrs services?
resteasy-jackson2-provider-3.0.6.Final.jar <-- remove
resteasy-jaxb-provider-3.0.6.Final.jar <-- remove
resteasy-multipart-provider-3.0.6.Final.jar <-- remove
slf4j-api-1.7.1.jar <-- are you server managed logging? if so remove

我认为您在这里拥有的大部分内容是因为您需要编译依赖项,但在运行时不需要它们。

另外,为什么您的应用程序中有两个 jaxrs 实现?这是故意的还是错误的?

【讨论】:

  • 不幸的是,我已经尝试消除所有不必要的依赖项(其中一些是由于项目最初是使用 Jersey 实现的),但我仍然遇到相同的错误。
  • 您是否有机会为我们提供小型复制器来解决您的问题?我们可以在 github 上的某个地方构建一些项目,或者您可以将复制器附加到 WildFly jira。
  • 我在 wstest 文件夹中放了一个小测试示例here。我使用 wildfly:deploy 目标部署它。非常感谢您的帮助。
【解决方案3】:

这应该可行。您可以发布完整的端点定义吗?我能想到的只是你可能在客户端端点上使用它,这是行不通的。

我刚刚在 Undertow 中添加了一个测试,它通过了,所以我不确定问题是什么:https://github.com/undertow-io/undertow/commit/1be41d70ec5268e557cf0657638f0f77bc6d2f58

【讨论】:

  • 非常感谢@Stuart 的帮助,我已经编辑了我的问题,添加了端点类的完整代码和 Wildfly 日志中的完整堆栈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 2020-04-12
  • 2013-10-22
  • 2020-07-10
  • 1970-01-01
相关资源
最近更新 更多