Spring Web Socket Session вызывает исключение Джексона - PullRequest
0 голосов
/ 13 декабря 2018

В приложении чата есть много комнат (тип карты), которые состоят из строк, логических и 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 голосов
/ 13 декабря 2018

A WebSocketSession - это абстракция для отправки сообщений через WebSocket.
В бэкэнде вы можете поддерживать WebSocketSession экземпляров (в то время как обычно вы поддерживаете некоторые конкретные значения WebSocketSession, такие как id) для выполнениянекоторое сопоставление (кто выполняет запрос и т. д.), но вы никогда не будете выставлять их и отправлять их в виде объекта JSON клиентам.
Зачем отправлять такую ​​полезную нагрузку клиентам?Зачем им знать подробности сети других пользователей (IP, sessionID и т. Д.)?Это только создаст накладные расходы и снизит уровень безопасности вашего приложения.

То есть WebSocketSession не реализует Serializable, поэтому Джексон не сериализует defacto (для этого требуется большая часть API обработки JSON в Java).

Чтобы решить вашу проблему:

Поскольку пользователям необходимо знать имена других пользователей чата, вы должны создать отображение между WebSocketSession.id и их уникальным псевдо/ username с Map<String, String> например.
А теперь выставьте List<String> users в возвращаемом объекте JSON.

0 голосов
/ 13 декабря 2018

Да, вы правы, WebSocketSession не поддерживает сериализацию json, и в любом случае вам лучше не отправлять эту информацию клиентской стороне.

Здесь можно использовать аннотацию игнорирования json

@JsonIgnore
private List<WebSocketSession> members

, поэтому Джексон будет игнорировать это поле при попытке сериализации объекта Room

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...