2

I have simple STOMP websockets:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
        registry.setApplicationDestinationPrefixes("/app");
        registry.setUserDestinationPrefix("/user");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws")
                .setAllowedOriginPatterns("*")
                .withSockJS()
                .setInterceptors(new HttpSessionHandshakeInterceptor());
    }

    @Override
    public boolean configureMessageConverters(List<MessageConverter> messageConverters) {
        DefaultContentTypeResolver resolver = new DefaultContentTypeResolver();
        resolver.setDefaultMimeType(MimeTypeUtils.APPLICATION_JSON);
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setObjectMapper(new ObjectMapper());
        converter.setContentTypeResolver(resolver);
        messageConverters.add(converter);
        return false;
    }
}

and controller

@RequiredArgsConstructor
@Getter
@AllArgsConstructor
public class ChatMessageForm {
    private  String id;
    //private  LocalDateTime timeStamp;
    private  String content;
    private  String recipientId;
    private  String senderId;
}
@Controller
@RequiredArgsConstructor
public class ChatController {

    private final ChatService chatService;

    @MessageMapping("/chat")
    public void handleChatMessage(@Payload ChatMessageForm message, SimpMessageHeaderAccessor headerAccessor) {
        chatService.handleChatMessage(new ChatMessage(
                LocalDateTime.now(),
                message.getContent(),
                message.getRecipientId(),
                message.getSenderId()
        ));
    }
}

and service:

@Service
@RequiredArgsConstructor
public class ChatServiceImpl implements ChatService {

    private final SimpMessagingTemplate messagingTemplate;

    @Override
    public void handleChatMessage(ChatMessage message) {
        messagingTemplate.convertAndSendToUser(
                message.getRecipientId(),
                "queue/messages",
                new ChatNotification(
                        "",
                        message.getSenderId(),
                        message.getRecipientId(),
                        message.getContent()
                )
        );
    }
}

When i send data from client, it is accepted by server and sent without any error, however in front-end i receive nothing:

 const connectWebSocket = () => {
        if (!user?.id) {
            console.error('User ID is not defined');
            return;
        }

        client.current = new Client({
            brokerURL: 'ws://127.0.0.1:8080/ws/websocket',
            debug: function (str) {
                console.log(str);
            },
            onConnect: () => {
                console.log('WebSocket connection established');
                client.current?.subscribe(`/user/${user.id}/queue/messages`, (message) => {
                    const receivedMessage: Message = JSON.parse(message.body);
                    console.log("Received message: ", receivedMessage);
                    updateChatWithNewMessage(receivedMessage);
                });
            },
            onStompError: (frame) => {
                console.error('Broker reported error: ' + frame.headers['message']);
                console.error('Additional details: ' + frame.body);
            },
            onWebSocketClose: () => {
                console.log('WebSocket connection closed');
            }
        });
        client.current.activate();
    };

The destination client subscribes to, and the one server sends message to is the same. What is causing this behavior? I have tried multiple browsers, tried to use IP instead of localhost. Server logs no errors neither front end. There is no error, no log from either back-end or front-end, the backend seems to send the message correctly. Thanks for help

1
  • Try to update queue/messages to /queue/messages when call messagingTemplate.convertAndSendToUser. Commented Jun 19 at 4:55

0