Не удалось обработать проблему GenericMessage с помощью WebSockets и MongoDB.JAVA

Программисты JAVA общаются здесь
Anonymous
Не удалось обработать проблему GenericMessage с помощью WebSockets и MongoDB.

Сообщение Anonymous »

Я хочу создать простой чат-сервис для своего проекта, в котором есть несколько пользователей ввода, но один конечный пользователь, который получает сообщения от всех них.
У меня есть такие классы

Код: Выделить всё

@Service
public class ChatUserService {

private final ChatUserRepository chatUserRepository;

@Autowired
public ChatUserService(ChatUserRepository chatUserRepository) {
this.chatUserRepository = chatUserRepository;
}

public void saveChatUser(ChatUser chatUser){
chatUser.setStatus(Status.ONLINE);
chatUserRepository.save(chatUser);
}
public void disconnect(ChatUser chatUser){
var connectedChatUser = chatUserRepository.findById(chatUser.getEmail())
.orElse(null);
if(connectedChatUser != null){
connectedChatUser.setStatus(Status.OFFLINE);
chatUserRepository.save(connectedChatUser);
}

}
public List findConnectedChatUsers(){
return chatUserRepository.findAllByStatus(Status.ONLINE);
}
}
.

Код: Выделить всё

@Controller
public class UserController {
private final ChatUserService chatUserService;

@Autowired
public UserController(ChatUserService chatUserService) {
this.chatUserService = chatUserService;
}

@MessageMapping("user.addUser")
@SendTo("/user/topic")
public ChatUser addUser(@Payload ChatUser chatUser){
chatUserService.saveChatUser(chatUser);
return chatUser;
}
такая конфигурация брокера сообщений

Код: Выделить всё

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/user");
registry.setApplicationDestinationPrefixes("/app");
registry.setUserDestinationPrefix("/user");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").withSockJS();
}

@Override
public boolean configureMessageConverters(List messageConverters) {
var resolver = new DefaultContentTypeResolver();
resolver.setDefaultMimeType(MimeTypeUtils.APPLICATION_JSON);
var converter = new MappingJackson2MessageConverter();
converter.setObjectMapper(new ObjectMapper());
converter.setContentTypeResolver(resolver);
messageConverters.add(converter);
return false;
}
}
и такой клиентский код

Код: Выделить всё

async function connect(event){
email = await fetchAdminEmail()
const socket = new SockJS('/ws');
stompClient = Stomp.over(socket);
stompClient.connect({},onConnected,onError);
event.preventDefault();
}
function onConnected() {
stompClient.subscribe(`/user/${email}/queue/messages`, onMessageReceived);
stompClient.subscribe(`/user/public`, onMessageReceived);
stompClient.send('/app/user.addUser',
{},
JSON.stringify({email: email,status:'ONLINE'})
);
findAndDisplayConnectedUsers().then();
}
async function findAndDisplayConnectedUsers(){
const connectedUserResponse = await fetch('/users');
let connectedUsers = await connectedUserResponse.json();
connectedUsers = connectedUsers.filter(user => user.email !== email);
const connectedUsersList = document.querySelector('#connectedUsers');
connectedUsersList.innerHTML = '';
connectedUsers.forEach(user => {
appendUserElement(user, connectedUsersList);
if (connectedUsers.indexOf(user) <  connectedUsers.length-1){
const separator = document.createElement('li');
separator.classList.add('separator');
connectedUsersList.appendChild(separator);
}
});
}
function appendUserElement(user, connectedUsersList) {
const listItem = document.createElement('li');
listItem.classList.add('user-item');
listItem.id = user.email;
const emailSpan = document.createElement('span');
emailSpan.textContent = user.email;
const receivedMessages = document.createElement('span');
receivedMessages.textContent = '';
receivedMessages.classList.add('nbr-msg','hidden');
listItem.append(emailSpan);
listItem.append(receivedMessages);
connectedUsersList.appendChild(listItem);
}
async function fetchAdminEmail(){
try{
const repsonse = await fetch('/admin');
const data = await repsonse.json();
return data.email;
} catch (error){
console.error("error: ",error);
return null;
}
}
document.addEventListener('DOMContentLoaded',function (){
connect(event);
});
Как только я захожу на свой веб-сайт, я получаю такую ​​ошибку весенней загрузки

Код: Выделить всё

Failed to handle GenericMessage [payload=byte[47], headers={simpMessageType=MESSAGE, conversionHint=method 'addUser' parameter -1, contentType=application/json,
simpSessionId=xmuzd12r, simpDestination=/user/topic}] to org.springframework.messaging.support.ExecutorSubscribableChannel$SendTask@3ad5d640 in UserDestinationMessageHandler[DefaultUserDestinationResolver[prefix=/user/]]
в консоли веб-браузера, кажется, нет ошибок, только журналы подписки и т. д. Может ли это быть проблема с настройкой mongodb? Потому что никаких сборов не ведется, а надо бы;

Подробнее здесь: https://stackoverflow.com/questions/783 ... nd-mongodb

Вернуться в «JAVA»