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
相关产品推荐
相关产品推荐

