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
queue/messages
to/queue/messages
when callmessagingTemplate.convertAndSendToUser
.