我正在尝试在Wildfly上部署包含WebSocket端点的应用程序,我收到此错误:
javax.websocket.DeploymentException:UT003012:方法public void 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拒绝部署应用程序。
UPDATE:这是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
答案 0 :(得分:3)
您正在使用javax.ws.rs.PathParam而不是javax.websocket.server.PathParam。
我可能会向Undertow添加一个警告,似乎可能会发生很多事情。
答案 1 :(得分:1)
您的问题是在错误的lib中,您的lib是服务器中提供的jar。 这可能会导致各种注射问题。
如果您使用maven构建,那么您的依赖项中只会遗漏少量<scope>provided</scope>
。
对个别罐子的评论:
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 impls?是故意还是错误?
答案 2 :(得分:0)
这应该有效。你可以发布完整的端点定义吗?我能想到的可能就是你在客户端端点上使用它,这是行不通的。
我刚刚给Undertow添加了一个测试,它传递得很好,所以我不确定问题是什么:https://github.com/undertow-io/undertow/commit/1be41d70ec5268e557cf0657638f0f77bc6d2f58