Spring实时聊天应用遭遇MessageConversionException异常,消息无法在前端页面展示
Spring实时聊天应用遭遇MessageConversionException异常,消息无法在前端页面展示
兄弟,我仔细看了你的代码和问题描述,这俩问题(消息不显示+MessageConversionException)其实是两个不同的点导致的,咱们一个个来解决:
一、前端消息不显示的直接原因
你写的showMessage函数里,创建了消息元素但没有把它添加到聊天容器里,而且设置样式的语法也错了(JS里元素的类名属性是className不是class)。修改后的showMessage应该是这样:
function showMessage(message){ let chat=document.getElementById('chat'); let messageElement=document.createElement('div'); messageElement.textContent=message.sender+':'+ message.content; messageElement.className="border-bottom mb-1"; // 修正为className chat.appendChild(messageElement); // 新增这行,把消息元素加入聊天容器 chat.scrollTop=chat.scrollHeight; }
这样消息才能被渲染到页面上~
二、后端MessageConversionException的根本原因
这个异常是因为Spring无法把前端发送的JSON消息转换成你的ChatMessage实体类,问题出在ChatMessage类的定义上:
Spring的WebSocket消息转换器(默认是Jackson)要求实体类必须满足:
- 拥有无参构造方法
- 所有字段都有对应的
getter和setter方法
你没贴ChatMessage的代码,我猜你大概率没写这些。给你一个标准的ChatMessage示例:
package com.chat.main.model; public class ChatMessage { private String sender; private String content; // 必须要有无参构造,Jackson需要它实例化对象 public ChatMessage() {} // 全参构造(可选,方便快速创建对象) public ChatMessage(String sender, String content) { this.sender = sender; this.content = content; } // 所有字段的getter/setter必须齐全,Jackson靠它赋值 public String getSender() { return sender; } public void setSender(String sender) { this.sender = sender; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
没有无参构造的话,Jackson没法实例化对象;没有getter/setter的话,没法给字段赋值,自然就会抛出转换异常。
最后再检查两个小细节
- 确保你的项目里引入了
spring-boot-starter-websocket依赖,这是Spring WebSocket的核心依赖 - 你的WebSocket配置里的跨域设置
setAllowedOrigins("http://localhost:8080")是对的,本地测试完全没问题
修改完这两处,应该就能正常收发消息啦!
备注:内容来源于stack exchange,提问作者Niraj Patle
相关产品推荐
相关产品推荐

