springboot+websocket 启动报Failed to register @ServerEndpoint

配置

img


服务类

img


启动报错

img


刚开始的时候是好的,等我在本地调试完了后,开始打包,刷新了下maven,再启动就报错了

看下maven依赖树,是不是存在依赖冲突。

缺依赖吧,看看maven有爆红吗,补上依赖就行了

在Spring Boot中使用WebSocket需要使用Spring的@ServerEndpoint注解来标记WebSocket处理程序类。如果在启动应用程序时遇到“Failed to register @ServerEndpoint”的错误,可能是因为没有正确配置WebSocket。

以下是一些可能导致此错误的常见原因和解决方法:

  1. 缺少WebSocket依赖项。请确保项目中包含了Spring WebSocket依赖项。

  2. 没有配置WebSocket处理程序类。请确保项目中有一个带有@ServerEndpoint注解的WebSocket处理程序类,并且该类已被正确扫描和加载。

  3. 没有启用WebSocket支持。请确保应用程序配置中已启用WebSocket支持。可以在application.properties文件中添加以下配置:

spring.websocket.enabled=true
  1. 配置文件中的错误。请检查配置文件,确保没有任何语法错误或拼写错误,并且所有必需的属性和值都已正确设置。

  2. 端口被占用。请确保应用程序使用的端口没有被其他进程占用。

如果以上步骤都没有解决问题,请尝试在应用程序启动时打印日志,以查看是否有其他错误消息。还可以尝试在WebSocket处理程序类上添加@ComponentScan注解,以确保Spring能够正确扫描和加载该类。

仔细看看是否哪里有报错的地方,可能是打包的时候有依赖没有打进去

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇文章:Springboot2.0 集成 websocket 出现 Failed to register @ServerEndpoint class 问题 也许有你想要的答案,你可以看看
  • 除此之外, 这篇博客: SpringBoot2.1+WebSocket:详解及注意事项中的 ServerEndpoint(相当于服务器端) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    1. 类添加上两个注解@Component@ServerEndpoint("/accesslog/ws/{username}")
    2. /accesslog/ws/{username}路径可以自定义,username用于区别每个不同的用户
    3. WebSocket四个事件,分别对应四个注解@OnOpen(建立连接)、@OnMessage(收到客户端消息)、@OnClose(连接关闭)、 @OnError(发生异常)
    4. WebSocket推送采用Session,username用于区分不同用户的Session。在建立连接的时候会将该用户的Session和username信息存入ConcurrentHashMap(保证多线程安全同时方便利用map.get(username)进行推送到指定用户),推送时只需要根据相应的username即可实现推送。推送方法和存储的map由一个工具类来实现(当然你也可以有更简单的实现方式),推送工具类见下一点。
    5. 小熙踩到过一个坑,SpringBoot项目设置了server.servlet.context-path=/accesslog后会直接导致WebSocket连接失败,猜测是由于路径的问题,但百思不得其解,尝试修改亦无果,望路过大神解惑一二。
    @Component
    @ServerEndpoint("/accesslog/ws/{username}")
    public class ChatRoomServerEndpoint {
        @OnOpen
        public void openSession(@PathParam("username") String username, Session session) {
            ONLINE_USER_SESSIONS.put(username, session);
            String message = "[" + username + "] 客户端信息!";
            sendMessageAll("服务器连接成功!");
            sendMessage(session,"");
            System.out.println("连接成功"+message);
        }
        @OnMessage
        public void onMessage(@PathParam("username") String username, String message) {
            System.out.println("服务器收到:"+"[" + username + "] : " + message);
            sendMessageAll("[" + username + "] : " + message);
        }
    
        @OnClose
        public void onClose(@PathParam("username") String username, Session session) {
            //当前的Session 移除
            ONLINE_USER_SESSIONS.remove(username);
            //并且通知其他人当前用户已经断开连接了
            sendMessageAll("[" + username + "] 断开连接!");
            try {
                session.close();
            } catch (IOException e) {
            }
        }
        @OnError
        public void onError(Session session, Throwable throwable) {
            try {
                session.close();
            } catch (IOException e) {
            }
        }
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

看下报错信息的cause by

确认依赖:首先确保在pom.xml文件中添加了正确的WebSocket依赖,包括spring-boot-starter-websocket和javax.websocket-api等。确保版本与Spring Boot版本兼容。

注册WebSocket配置类:在Spring Boot应用程序中,您需要将WebSocket配置类标记为@Configuration,并且使用@EnableWebSocket注解启用WebSocket。

注册端点:使用@ServerEndpoint注解标记WebSocket处理类时,确保端点路径是唯一的。每个WebSocket处理类都应该有一个唯一的端点路径。

扫描配置:在Spring Boot中,需要通过配置@ComponentScan来扫描WebSocket处理类,确保它们被正确地注册到应用程序上下文中。

端口冲突:确保WebSocket使用的端口未被其他进程占用。

确认Web容器:如果您使用了外部Web容器(例如Tomcat),请确保它支持WebSocket。对于Tomcat,必须使用Tomcat 8以上版本。

版本兼容性:如果您使用的是Spring Boot的旧版本,可能会出现与WebSocket相关的问题。尝试升级到较新的Spring Boot版本,以确保WebSocket功能得到良好支持。

解决办法1:删除WebSocketConfig.class类即可

解决办法 2: 删除@Component注解再打包就可以了,websocket上面其实不需要这个注解的

提供参考实例,链接1:https://blog.csdn.net/houjiezhuang/article/details/121997179?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-121997179-blog-126389986.235%5Ev38%5Epc_relevant_anti_vip_base&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-121997179-blog-126389986.235%5Ev38%5Epc_relevant_anti_vip_base&utm_relevant_index=1
链接2:https://blog.csdn.net/weixin_43666595/article/details/126389986

看看包什么的有没有冲突,或者websocket中的一些注解参数有没有写对

看下这篇文章,对你的问题有没有帮助:https://blog.csdn.net/qq_42983806/article/details/107462859

重新bulid下项目 看是不是哪丢失了

确保项目中包含适当的WebSocket依赖项。在应用程序配置文件中,确保包含适当的WebSocket配置。可以在application.properties文件中添加配置。类上必须存在@ServerEndpoint注释,并且注释的值是WebSocket端点的URL路径。

springboot+websocket 启动报Failed to register @ServerEndpoint
大致以下几种解决办法,如果有类似错误,大家可以按下面几类错误对照检查一下

1、

@ServerEndpoint("/webSocket/message/{xxx}/{xxxx}")
路径前面没有“/”,会导致这个错误,注意检查。

2、

 @OnOpen
    public void onOpen(Session session, @PathParam("xxx") String xxx, @PathParam("xxxx") Integer xxxx) 
获取路径中的参数时要使用@PathParam,若使用了其他的会报错。

3、

@Component
去掉类名上的@Component注解可解决报错,亲测确实没有报错了,但是在本地也无法建立连接了,只能打包时侯将该注解去掉,只能说这样做有用,但是不太方便。

4AOP的问题,没太理解具体要怎么处理,不再详细阐述了。

5、这个是我自己项目的解决办法,试了以上几个办法都不太有效的时候,我又去详细观察了报错信息,还真的让我发现了一段有价值的报错信息,如下:

Caused by: javax.websocket.DeploymentException: No Throwable parameter was present on the method [onError] of class [com.dxhy.bxsdk.business.websocketService.MessageWebsocket] that was annotated with OnError
大致意思就是说

原因:javax.websocket.DeploymentException:使用 OnError 注释的类 [com.dxhy.bxsdk.business.websocketService.MessageWebsocket] 的方法 [onError] 上没有 Throwable 参数
根据这段报错信息,我去检查了onError方法,果然没有Throwable参数,加上之后就好了,加完后的代码如下:

  @OnError
    public void onError(Session session, Throwable error) {
        log.info("连接错误!原因:{}", error.getMessage());
    }

Simetrix和Simplis是现在电路仿真软件中最流行的两个版本,它们之间有一些不同之处,主要区别包括以下几个方面:

  1. 仿真引擎区别

Simetrix和Simplis使用不同的仿真引擎。Simetrix使用自己的仿真引擎,而Simplis则使用Spectre仿真引擎。由于Spectre具有高速仿真和相对较快的收敛速度,因此Simplis更适合快速仿真和分析复杂的电路。

  1. 简单性和易用性区别

Simplis的设计是为了使电路仿真尽可能简单和易于使用。与Simetrix相比,Simplis具有更多的自动化和快速建模工具。这使得它易于使用,对于初学者和需要快速测试电路的工程师非常有用。Simetrix是一种复杂的软件,它更适合有经验的用户,需要更大的自定义和精细调整。

  1. 集成电路仿真能力区别

Simplis是一种用于分析和仿真大规模集成电路的工具。在此方面,Simplis比Simetrix更加高效和强大。Simplis提供了专业的工具,可以准确模拟大规模集成电路中的各个细节,包括噪声和时序问题等。

  1. 仿真速度区别

因为Simplis使用Spectre仿真引擎,因此它的仿真速度较快。Simplis能够在较短时间内处理更多的仿真结果,并且可以加速更多的仿真进程。Simetrix通过CPU缓存和高速嵌入式算法进行加速,但是Simplis具有更好的优化功能,可以处理更多的数据和精度。

  1. 应用领域区别

Simplis的主要应用领域是集成电路和嵌入式系统,因为Simplis的速度和效率使其成为大规模集成电路和嵌入式系统仿真的首选工具。Simetrix更适合模拟更小的电路,包括模拟电路和数字电路等。

总体来说,Simplis和Simetrix是两种功能强大的仿真工具,它们有一些差异,包括仿真引擎,简单性和易用性,集成电路仿真能力,仿真速度和应用领域等。选择哪个工具取决于您的需求和技能水平。

当使用 Spring Boot 和 WebSocket 时,如果您的应用程序在启动时报告 "Failed to register @ServerEndpoint" 错误,有几个可能的原因:
1.缺少依赖项:确保您的项目中包含适当的依赖项。 Spring Boot WebSocket 需要 Spring Web 和 Spring Web MVC 的依赖项。您可以在 Maven 或 Gradle 构建文件中添加以下依赖项:

org.springframework.boot spring-boot-starter-websocket

2.配置错误:检查您的应用程序配置文件,确保您已正确配置 WebSocket。您需要指定一个 ServerEndpoint 类或注解,指定 WebSocket 处理程序。例如,您可以在配置文件中添加以下内容:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    registry.addHandler(myHandler(), "/my-websocket-endpoint");
}

@Bean
public MyWebSocketHandler myHandler() {
    return new MyWebSocketHandler();
}

}
在上面的示例中,MyWebSocketHandler 是您的 ServerEndpoint 类。您可以将其替换为您自己的实现。

3.重复端点:检查您的应用程序中是否已经注册了相同的端点的其他处理程序。如果已经存在一个处理程序,并且您尝试注册另一个处理程序,将导致注册失败。

4.上下文问题:如果您的应用程序使用不同的上下文路径,请确保您已正确配置处理程序。例如,如果您的应用程序在 /app 路径下运行,您需要将 WebSocket 处理程序注册为 /app/my-websocket-endpoint。

该回答引用chatGPT仅供参考,如有帮助,希望采纳。

根据你提供的代码,出现`Failed to register @ServerEndpoint`错误的原因可能是由于以下几个问题:

1. 缺少分号:在`MyWebSocketConfig`类中,`serverEndpointExporter`方法的定义缺少了分号。请确保代码正确书写如下:
```java
@Bean
public ServerEndpointExporter serverEndpointExporter() {
    return new ServerEndpointExporter();
}
  1. 类引用问题:在WebSocketService类中,RedisUtilWebSocketUserService类的静态字段注入方式不正确。将其改为非静态,并进行实例化。

修改后的代码如下所示:

public class WebSocketService {

    private RedisUtil redisUtil;
    private WebSocketUserService webSocketUserService;

    // 其他代码...

    @Autowired
    public void initService(RedisUtil redisUtil, WebSocketUserService webSocketUserService) {
        this.redisUtil = redisUtil;
        this.webSocketUserService = webSocketUserService;
    }

    // 其他代码...
}

这样做将会使得RedisUtilWebSocketUserService被正确地注入到WebSocketService类中。

请注意,在使用@Autowired注解时,需要确保相关的依赖项已经正确配置并可用。

如果修改后仍然遇到问题,请提供完整的错误信息以便更进一步的排查。

```