在聊天应用程序中,有许多房间(地图类型),其中包括字符串,布尔值和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;
}
}
答案 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.id
在Map<String, String>
及其唯一的伪/用户名之间创建映射。
现在,在返回的JSON对象中公开List<String> users
。