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

Quarkus后端返回MessageJson非JSON格式,前端解析失败求助

解决Quarkus WebSocket返回标准JSON的问题

问题根源

你现在调用messageJson.toString()得到的是Java对象的默认字符串表示,这根本不是标准JSON格式,所以前端JSON.parse()必然解析失败。核心是要把MessageJson对象序列化为标准JSON字符串,而非依赖默认的toString方法。

原生实现方案(无需额外依赖)

Quarkus默认集成了Jackson作为JSON处理工具,完全可以原生实现序列化,不需要引入GSON:

  1. 在WebSocket端点类中注入Quarkus管理的ObjectMapper实例:
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.inject.Inject;
import jakarta.websocket.OnMessage;
import jakarta.websocket.Session;
import jakarta.websocket.server.ServerEndpoint;

@ServerEndpoint("/chat")
public class ChatWebSocket {

    @Inject
    ObjectMapper objectMapper;

    @OnMessage
    public void onMessage(String message, Session session) throws Exception {
        // 假设已解析得到MessageJson对象
        MessageJson messageJson = ...;
        // 序列化为标准JSON字符串
        String jsonStr = objectMapper.writeValueAsString(messageJson);
        // 发送给前端
        session.getBasicRemote().sendText(jsonStr);
    }
}
  1. 确保MessageJson是普通POJO,字段有对应的getter方法(Jackson默认通过getter序列化字段),如需自定义字段名可添加Jackson注解:
import com.fasterxml.jackson.annotation.JsonProperty;

public class MessageJson {
    @JsonProperty("to_recipient")
    private String toRecipient;
    private String content;

    // 必须提供getter方法
    public String getToRecipient() { return toRecipient; }
    public String getContent() { return content; }

    // setter和构造方法按需添加
}

关于@Produces注解

@Produces是JAX-RS(REST接口)中指定响应媒体类型的注解,WebSocket端点完全用不上。WebSocket发送的是文本消息,直接返回序列化后的JSON字符串即可。

是否需要依赖GSON

不需要,Quarkus原生集成的Jackson已经能满足所有常规JSON序列化需求。除非项目中已大量使用GSON,或有Jackson不支持的特殊序列化逻辑,否则没必要额外引入GSON依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:01:26