это мой первый опыт работы с веб-сокетами, и я все еще настраиваюсь на Springboot.Я следовал этому уроку https://www.callicoder.com/spring-boot-websocket-chat-example/ и работал нормально.
Однако я внес некоторые изменения в код и добавил новую модель ChatUser.Когда я пытаюсь отправить сообщение с помощью stompClient, внешний интерфейс заполняет модель и отправляет ее бэкэнду, однако на стороне java модель полна нулевых значений.Пожалуйста, объясните, почему это происходит.Если я пытаюсь получить строку или сообщение ChatMessage (исходная модель из учебника), модель заполняется нормально.
Обработчик сообщений внутреннего интерфейса
@MessageMapping("/chat.addUser")
@SendTo("/topic/public")
public ChatUser addUser(@Payload ChatUser user, SimpMessageHeaderAccessor headerAccessor) {
//add username in web socket session
ChatService service = new ChatService();
if(user.getId() == null) {
service.incrementId();
user.setId(service.getNewId());
}
user.setStatus(Status.ACTIVE);
service.addActiveUsers(user);
headerAccessor.getSessionAttributes().put(Constants.USERID, user.getId());
headerAccessor.getSessionAttributes().put(Constants.USERNAME, user.getUserName());
return user;
}
UI
stompClient.send("/app/chat.addUser",
{},
JSON.stringify({user: username})
)
Я сделал модель в пользовательском интерфейсе проще, чтобы увидеть, смогу ли я заполнить только имя пользователя, однако она все равно вернула нулевое значение.Также не удалось удалить @ Payload.
Модель ChatUser
package com.webchatapp.webchatapplication.model;
public class ChatUser {
private String user;
private Integer id;
private Status type;
private ChatMessage message;
public enum Status{
ACTIVE,
DISCONNECTED
}
public String getUserName() {
return user;
}
public void setUserName(String user) {
this.user = user;
}
public Integer getId() {
return id;
}
public void setChatMessage(ChatMessage message) {
this.message = message;
}
public ChatMessage getChatMessage() {
return message;
}
public void setId(Integer id) {
this.id = id;
}
public Status getStatus() {
return type;
}
public void setStatus(Status type) {
this.type = type;
}
}