websocket Caused by: javax.websocket.DeploymentException

记录编写websocket出现的错误

java.lang.IllegalStateException: Failed to register @ServerEndpoint class: class com.websocket.websocket.ChatEndpoint
在网上找到很多帖子,大部分都说的是使用springboot本身集成的容器和单独使用容器的不同,在扫描websocket组件时,产生的差异而报的错;
例如:
容器扫描的组件不一致导致的问题

而我在启动websocket应用中,并未发现编写有错误,多次尝试启动,均报一下错误,经检查是使用注解编写websocket类时,springboot本身会对传入的参数进行校验,检验失败就会报错。
Caused by: javax.websocket.DeploymentException: A parameter of type [interface javax.websocket.EndpointConfig] was found on method[close] of class [java.lang.reflect.Method] that did not have a @PathParam annotation

    @OnClose
    public void close(Session session, EndpointConfig config) {

    }
    @OnError
    public void error(Session session, EndpointConfig config) {

    }

//===================而在以继承方式编写websocket的参数时不一样=====
  public abstract class Endpoint {
    public Endpoint() {
    }
    public abstract void onOpen(Session var1, EndpointConfig var2);
    
    public void onClose(Session session, CloseReason closeReason{
    }
    public void onError(Session session, Throwable throwable) {
    }
}
// 这两者传入参数的对比,就会发现问题

对传入的形参进行修改,则启动正常

java.lang.NoClassDefFoundError: javax/websocket/DeploymentException at java.lang.Class.getDeclaredConstructors0(Native Method) at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671) at java.lang.Class.getDeclaredConstructors(Class.java:2020) at org.springframework.boot.context.properties.ConfigurationPropertiesBindConstructorProvider.findConstructorBindingAnnotatedConstructor(ConfigurationPropertiesBindConstructorProvider.java:62) at org.springframework.boot.context.properties.ConfigurationPropertiesBindConstructorProvider.getBindConstructor(ConfigurationPropertiesBindConstructorProvider.java:48) at org.springframework.boot.context.properties.ConfigurationPropertiesBean$BindMethod.forType(ConfigurationPropertiesBean.java:311) at org.springframework.boot.context.properties.ConfigurationPropertiesBeanDefinitionValidator.validate(ConfigurationPropertiesBeanDefinitionValidator.java:63) at org.springframework.boot.context.properties.ConfigurationPropertiesBeanDefinitionValidator.postProcessBeanFactory(ConfigurationPropertiesBeanDefinitionValidator.java:45) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:286) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:174) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:706) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) at com.samhk.ynashk.YnashkApplication.main(YnashkApplication.java:15) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) Caused by: java.lang.ClassNotFoundException: javax.websocket.DeploymentException at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 24 common frames omitted Process finished with exit code 0
最新发布
07-03
<think>嗯,用户遇到了java.lang.ClassNotFoundException: javax.websocket.Session的问题。需要找出原因和解决方法。首先,回忆一下相关的引用,比如引用[1]提到类似的问题,可能是缺少依赖。引用[3]提到Spring Boot内置Tomcat可能有冲突,可能需要排除或调整依赖。另外,引用[5]提到依赖配置错误的情况,可能需要检查groupId和artifactId是否正确。 可能的原因有几个:1.项目中没有正确引入WebSocket的依赖库。比如Java EE的websocket-api或者Tyrus的实现。2.依赖作用域设置不正确,比如provided导致打包时缺少。3.在单元测试环境下,依赖没有被正确包含,可能需要调整作用域。4.依赖版本冲突,比如不同库的版本不兼容。5.如果是Spring Boot项目,可能需要排除内置Tomcat的WebSocket模块,改用其他容器。 解决方案方面,首先应该检查pom.xml或者build.gradle中的依赖是否正确添加了javax.websocket相关的库。例如,添加javax.websocket-api,并确保作用域正确。如果是单元测试的问题,可能需要将作用域从provided改为test或runtime。如果使用Spring Boot,可能需要排除tomcat-websocket,然后添加其他实现如Tyrus。另外,检查依赖的groupId和artifactId是否有拼写错误,比如是否写成了javax.servlet而不是javax.websocket。 还需要考虑Java版本的问题,比如如果使用Java 9及以上,可能需要额外添加依赖,类似引用[4]中提到的JAXB问题,不过这里可能不需要。另外,单元测试和运行时环境的不同,比如Tomcat在运行时提供依赖,但单元测试时没有容器,导致类找不到,所以需要显式添加依赖。 最后,用户可能需要运行mvn dependency:tree检查依赖树,确认是否有冲突或缺失的情况。同时,清理和重新构建项目,确保依赖被正确下载和引入。</think>### 问题分析:`java.lang.ClassNotFoundException: javax.websocket.Session` 该问题通常由以下原因导致: 1. **缺少 WebSocket 依赖**:未正确引入 WebSocket API 的实现库(如 Tyrus、Tomcat 的 WebSocket 实现)。 2. **依赖作用域配置错误**:依赖声明为 `provided`(仅在运行时由容器提供),但单元测试环境未提供该依赖[^3]。 3. **版本冲突**:Spring Boot 内置 Tomcat 的 WebSocket 模块与其他实现冲突[^3]。 4. **依赖声明错误**:`groupId` 或 `artifactId` 拼写错误,导致依赖未正确加载[^2][^5]。 --- ### 解决方案步骤 #### 1. 添加 WebSocket 依赖 在 `pom.xml` 中添加以下依赖(以 Tyrus 实现为例): ```xml <dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1.1</version> <scope>provided</scope> <!-- 若需单元测试,改为 compile --> </dependency> <dependency> <groupId>org.glassfish.tyrus</groupId> <artifactId>tyrus-client</artifactId> <version>1.19</version> </dependency> ``` - **关键点**: - 若使用单元测试,将 `javax.websocket-api` 的 `scope` 改为 `compile` 或移除作用域声明,确保类在测试时可用[^3]。 - 若使用 Spring Boot,需排除内置 Tomcat 的 WebSocket 模块: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> </exclusion> </exclusions> </dependency> ``` #### 2. 检查依赖声明 确认 `groupId` 和 `artifactId` 拼写正确: ```xml <!-- 正确声明 --> <dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1.1</version> </dependency> ``` #### 3. 清理并重新构建项目 运行以下命令确保依赖生效: ```bash mvn clean install ``` --- ### 验证方案 - **单元测试验证**:编写一个简单的 WebSocket 客户端测试,确认 `javax.websocket.Session` 可正常实例化。 - **依赖树检查**:执行 `mvn dependency:tree` 检查 WebSocket 相关依赖是否被正确引入。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值