Spring Web Socket Session引发Jackson异常

时间:2018-12-13 09:06:56

标签: json spring websocket jackson

在聊天应用程序中,有许多房间(地图类型),其中包括字符串,布尔值和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获取房间的方法。我该怎么做才能正确收到该回复?

为了向您提供更多信息,我发布了“房间等级”。

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;
    }
}

2 个答案:

答案 0 :(得分:1)

是的,是的,WebSocketSession不能序列化为json,无论如何,最好不要将此信息发送给客户端。

您可以在此处使用json忽略注释

@JsonIgnore
private List<WebSocketSession> members

因此,杰克逊在尝试序列化Room对象时将忽略此字段

答案 1 :(得分:1)

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

因此,WebSocketSession没有实现Serializable,因此事实上无法由Jackson进行序列化(这需要Java中的大多数JSON处理API)。

要解决您的问题:

由于用户需要知道其他聊天室用户的姓名,因此您应该 例如,使用WebSocketSession.idMap<String, String>及其唯一的伪/用户名之间创建映射。
现在,在返回的JSON对象中公开List<String> users