因此,我一直在尝试为我的应用程序编写简单的通知,并遇到以下问题。我能够连接WebSocket,但它也应该在控制台中写入消息,而它没有。我刚开始学习websockets和通知2天前,所以我真的不明白我应该如何正确地写
我的配置:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/all","/specific");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setAllowedOriginPatterns("*").withSockJS();
}
}
控制器:
@RestController
public class MessageController {
@Autowired
private MessageService messageService;
@MessageMapping("/message")
// @SendTo("/all/messages")
public ResponseEntity<MessageResponse> sendMessageToAll(@RequestBody MessageRequest request) {
return ResponseEntity.ok(messageService.sendMessageToAll(request.getMessage()));
}
@MessageMapping("/message-user")
public ResponseEntity<MessageResponse> sendMessageToUser(@RequestBody MessageRequest request) {
return ResponseEntity.ok(messageService.sendMessageToUser(request.getUser(), request.getMessage()));
}
}
请求:
@Getter
public class MessageRequest {
String message = "mess";
User user;
}
回复:
public class MessageResponse{
String message;
}
消息模型:
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Message {
private String message = "mess";
private String recipient;
private boolean isRead;
@ManyToOne
private User user;
@Override
public String toString() {
return "Message{" +
"message='" + message + '\'' +
", recipient='" + recipient + '\'' +
'}';
}
}
服务及其实施:
public interface MessageService {
MessageResponse sendMessageToUser(User user, String message);
MessageResponse sendMessageToAll(String message);
}
@Service
public class MessageServiceImpl implements MessageService {
@Autowired
private SimpMessagingTemplate messagingTemplate;
@Override
public MessageResponse sendMessageToAll(String message) {
messagingTemplate.convertAndSend("/all/messages", "meessaaaa");
return new MessageResponse();
}
@Override
public MessageResponse sendMessageToUser(User user, String message) {
messagingTemplate.convertAndSendToUser(user.getUsername(), "/specific", message);
return new MessageResponse();
}
}
为了以防万一,这是我用来检查代码的测试html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>STOMP</title>
</head>
<body>
<h1>STOMP test</h1>
<script crossorigin="anonymous"
integrity="sha256-wS9gmOZBqsqWxgIVgA8Y9WcQOa7PgSIX+rPA0VL2rbQ="
src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
<script crossorigin="anonymous"
integrity="sha512-iKDtgDyTHjAitUDdLljGhenhPwrbBfqTKWO1mkhSFH3A7blITC9MhYon6SjnMhp4o0rADGw9yAC6EW4t5a4K3g=="
src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
<script type="text/javascript">
let url = ('ws://localhost:8080/ws/websocket')
console.log(url)
stompClient = Stomp.client(url)
stompClient.connect({
}, function () {
stompClient.subscribe('/all/messages', function (output) {
console.log(JSON.parse(output.body))
});
}, function (err) {
alert('error' + err);
});
</script>
</body>
</html>
有人能解决吗?
1条答案
按热度按时间pu82cl6c1#
目前在您发布的示例中,没有自动向
/all/messages
路径发送消息的逻辑,因此在建立WebSocket连接后,控制台中没有任何内容。尝试发送一些消息到这个路径,或者简单地用下面的代码片段更新你的代码,发送一个虚拟消息,然后将消息发送到/all/message
路径。