【问题标题】:Spring Web Socket Session throws Jackson ExceptionSpring Web Socket Session 抛出 Jackson 异常
【发布时间】:2018-12-13 09:06:56
【问题描述】:

在聊天应用中,有很多房间(地图类型),由字符串、布尔值和List<WebSocketSession>组成。

我认为问题是 List<WebSocketSession> 无法写入 JSON。

@RequestMapping(value = "/api/v1/lobby/roomList", method = RequestMethod.GET)
    public ResponseEntity<Object> getRooms(
            HttpServletRequest request,
            HttpServletResponse response) {

        logger.debug("RoomCtrl - getRooms");
        Map<Integer, Room> rooms = roomService.getRooms();
        Map<String, Object> returnMap = new HashMap<>();
        returnMap.put("rooms", rooms);

        return new ResponseEntity<>(
                returnMap,
                HttpStatus.OK);
    }

这是我从roomService 获取房间的方法。我必须做些什么才能正确收到该响应?

为了向您提供更多信息,我发布了 Room Class。

public class Room {
    private String host, title;
    private List<WebSocketSession> members = new ArrayList<>();
    private boolean status;

    public String getHost() {
        return host;
    }
    public void setHost(String host) {
        this.host = host;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public List<WebSocketSession> getMembers() {
        return members;
    }
    public void setMembers(List<WebSocketSession> members) {
        this.members = members;
    }
    public boolean isStatus() {
        return status;
    }
    public void setStatus(boolean status) {
        this.status = status;
    }
}

【问题讨论】:

    标签: json spring websocket jackson


    【解决方案1】:

    WebSocketSession 是通过 WebSocket 发送消息的抽象。
    在后端,您可以维护WebSocketSession 实例(而通常您维护WebSocketSession 的一些特定值,例如id)以执行一些匹配(谁执行请求等等......)但您永远不会暴露和将它们以 JSON 对象的形式发送给客户端。
    为什么要向客户端发送这样的有效负载?为什么他们要知道其他用户的网络详细信息(IP、sessionID 等)?它只会产生开销并降低应用程序的安全级别。

    所以WebSocketSession 没有实现Serializable,因此Jackson 实际上不能序列化(这需要Java 中的大多数JSON 处理API)。

    解决您的问题:

    由于用户需要知道其他聊天室用户的姓名,因此您应该 在WebSocketSession.id 与其唯一的伪/用户名之间创建一个映射,例如Map&lt;String, String&gt;
    现在在返回的 JSON 对象中公开List&lt;String&gt; users

    【讨论】:

    • 非常感谢,现在我知道我必须做什么了。
    • 不客气。很高兴它可能对您有所帮助:)
    【解决方案2】:

    是的,你是对的,WebSocketSession 不是 json 可序列化的,无论如何你最好不要将此信息发送到客户端。

    这里可以使用json忽略注解

    @JsonIgnore
    private List<WebSocketSession> members
    

    所以 Jackson 在尝试序列化 Room 对象时会忽略此字段

    【讨论】:

    • 那么,我如何从服务器获取members ?只是将List&lt;String&gt; membersList 添加到 Room 类?
    猜你喜欢
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多