You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot+Thymeleaf聊天框集成后消息处理器异常排查

SpringBoot WebSocket聊天框集成后请求报错的解决方案

问题拆解

我看了你提供的代码和日志,核心问题很明确:单独运行正常的聊天框集成到现有项目后,触发了Unhandled exception from message handler method错误,但根源不是WebSocket本身的逻辑,而是你的项目里的WebLogAspect切面在处理WebSocket请求时抛出了NullPointerException(日志里明确指向WebLogAspect.java:33)。

相关代码片段

前端调用代码(Main.js)

function onConnected() {
    stompClient.subscribe('/topic/publicChatRoom', onMessageReceived); // 订阅公共话题
    // 向服务器发送用户名
    stompClient.send("/app/chat.addUser", {}, JSON.stringify({sender: username, type: 'JOIN'}) )
    connectingElement.classList.add('hidden');
}

后端Controller代码(WebSocketController.java)

@MessageMapping("/chat.addUser")
@SendTo("/topic/publicChatRoom")
public ChatMessage addUser(@Payload ChatMessage chatMessage,SimpMessageHeaderAccessor headerAccessor) {
    // 将用户名存入WebSocket会话
    System.out.println("In addUser");
    headerAccessor.getSessionAttributes().put("username",chatMessage.getSender());
    return chatMessage;
}

关键错误日志

2019-05-30 17:12:14,899 [1;31mERROR[0;39m [ndChannel-23] [36m.WebSocketAnnotationMethodMessageHandler[0;39m : Unhandled exception from message handler method
java.lang.NullPointerException: null
at com.bmc.app.config.WebLogAspect.doBefore(WebLogAspect.java:33) ~[classes/:na]

问题原因

WebSocket消息处理和普通HTTP请求的生命周期不一样,你的WebLogAspect应该是为HTTP请求设计的,里面可能在尝试获取HttpServletRequest这类HTTP相关对象,但在WebSocket消息处理阶段,这些对象是null的,所以触发了空指针异常,导致WebSocket的消息处理被中断。

解决方案

你有两种简单的修复方式:

方式1:让切面跳过WebSocket相关方法

修改你的WebLogAspect里的切点定义,排除WebSocket Controller的所有方法,这样切面就不会去干扰WebSocket的请求处理了:

@Pointcut("execution(public * com.bmc.app.controller..*(..)) && !execution(public * com.bmc.app.controller.WebSocketController.*(..))")
public void webLog() {}

方式2:在切面中添加空指针判断

找到WebLogAspect.java第33行的代码,通常是获取请求对象的逻辑,先判断对象是否为空,为空就跳过日志处理:

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes == null) {
    // 非HTTP请求,直接返回
    return;
}
HttpServletRequest request = attributes.getRequest();
// 后续的日志记录逻辑

验证步骤

修改完成后重启项目,测试一下:

  • 检查日志是否还会出现那个NullPointerException
  • 看控制台是否打印了In addUser,确认addUser方法被正常调用
  • 前端是否能成功加入聊天,收到JOIN类型的消息

内容的提问来源于stack exchange,提问作者Yash Ambike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:57:48