Spring Boot中的@MessageMapping注解:原理及使用

在Web应用程序中,实现实时的双向通信是一项重要的功能。为了实现这种功能,需要使用WebSocket协议。Spring框架提供了Spring WebSocket模块来实现WebSocket通信。Spring Boot是基于Spring框架构建的,它提供了一些方便的注解和自动配置来简化WebSocket的开发。

@MessageMapping注解是Spring Boot提供的一个重要的注解之一,它可以帮助我们处理WebSocket消息。本文将介绍@MessageMapping注解的原理及使用方法。

在Spring Boot中,@MessageMapping注解用于标识WebSocket消息的处理方法。当客户端发送一个WebSocket消息到服务器端时,@MessageMapping注解可以将该消息路由到对应的处理方法中进行处理。

@MessageMapping注解的使用方法类似于@RequestMapping注解。我们可以将@MessageMapping注解应用在控制器的处理方法上,以处理特定的WebSocket消息。当客户端发送一个特定的消息到服务器端时,服务器就会调用标记有@MessageMapping注解的处理方法来处理该消息。

下面是一个简单的示例:

@Controller
public class WebSocketController {
    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message) throws Exception {
        Thread.sleep(1000); // simulated delay
        return new Greeting("Hello, " + message.getName() + "!");

在上面的例子中,我们定义了一个WebSocket控制器,并在其中定义了一个标记有@MessageMapping注解的处理方法。该处理方法用于处理名为“/hello”的WebSocket消息,并将处理结果发送到“/topic/greetings”主题。

在Spring Boot应用程序中,我们可以通过使用@EnableWebSocketMessageBroker注解来启用WebSocket消息代理。当该注解被应用时,Spring Boot将自动配置WebSocket消息代理,以便我们可以使用@MessageMapping和@SendTo等注解来处理WebSocket消息。

使用@MessageMapping注解处理WebSocket消息的过程非常简单。我们只需要在控制器的处理方法上添加@MessageMapping注解,并指定该方法应该处理的WebSocket消息类型即可。

下面是一个更完整的示例:

@Controller
public class WebSocketController {
    @MessageMapping("/chat/{roomId}")
    @SendTo("/topic/chat/{roomId}")
    public ChatMessage handleChatMessage(@DestinationVariable String roomId, ChatMessage message) {
        return message;

在上面的例子中,我们定义了一个WebSocket控制器,并在其中定义了一个标记有@MessageMapping注解的处理方法。该处理方法用于处理名为“/chat/{roomId}”的WebSocket消息,并将处理结果发送到“/topic/chat/{roomId}”主题。

在我们的处理方法中,我们可以使用@DestinationVariable注解来获取WebSocket消息中的路径变量。在这个例子中,我们使用@DestinationVariable来获取roomId路径变量的值。

除了@MessageMapping注解之外,Spring Boot还提供了许多其他的注解和工具,以帮助我们更容易地处理WebSocket消息。例如,@SendTo注解可以将处理结果发送到指定的WebSocket主题;@Payload注解可以用于标识WebSocket消息的有效负载;@Payload注解可以用于将WebSocket消息的有效负载反序列化为Java对象。

下面是一个完整的Spring Boot WebSocket应用程序代码示例:

@SpringBootApplication
@EnableWebSocketMessageBroker
public class WebSocketDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(WebSocketDemoApplication.class, args);
    @Configuration
    @EnableWebSocket
    public class WebSocketConfig implements WebSocketConfigurer {
        @Override
        public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
            registry.addHandler(chatWebSocketHandler(), "/chat/{roomId}").setAllowedOrigins("*");
        @Bean
        public WebSocketHandler chatWebSocketHandler() {
            return new ChatWebSocketHandler();
    @Controller
    public class WebSocketController {
        @MessageMapping("/chat/{roomId}")
        @SendTo("/topic/chat/{roomId}")
        public ChatMessage handleChatMessage(@DestinationVariable String roomId, ChatMessage message) {
            return message;
    public class ChatMessage {
        private String content;
        private String sender;
        // getters and setters
    public class ChatWebSocketHandler extends TextWebSocketHandler {
        private final ObjectMapper objectMapper = new ObjectMapper();
        @Override
        public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
            ChatMessage chatMessage = objectMapper.readValue(message.getPayload(), ChatMessage.class);
            // do something with the chatMessage
        @Override
        public void afterConnectionEstablished(WebSocketSession session) throws Exception {
            // do something after a WebSocket connection is established

在上面的代码示例中,我们定义了一个名为“WebSocketDemoApplication”的Spring Boot应用程序。该应用程序使用@EnableWebSocketMessageBroker注解启用WebSocket消息代理,并定义了一个WebSocket控制器和一个WebSocket处理程序。

在WebSocket控制器中,我们定义了一个标记有@MessageMapping注解的处理方法,该方法用于处理名为“/chat/{roomId}”的WebSocket消息,并将处理结果发送到名为“/topic/chat/{roomId}”的主题。

在WebSocket处理程序中,我们使用TextWebSocketHandler来处理WebSocket消息。在handleTextMessage方法中,我们使用ObjectMapper来将WebSocket消息的有效负载反序列化为ChatMessage对象,然后进行一些处理。在afterConnectionEstablished方法中,我们可以执行一些WebSocket连接建立后的操作。

在本文中,我们介绍了Spring Boot中的@MessageMapping注解及其原理和使用方法。使用@MessageMapping注解可以帮助我们更轻松地处理WebSocket消息,从而实现实时的双向通信。除了@MessageMapping注解之外,Spring Boot还提供了许多其他的注解和工具,以帮助我们更轻松地处理WebSocket消息。如果您正在开发WebSocket应用程序,@MessageMapping注解是一个非常有用的工具,它可以帮助您更轻松地处理WebSocket消息。

在Web应用程序中,实现实时的双向通信是一项重要的功能。为了实现这种功能,需要使用WebSocket协议。Spring框架提供了Spring WebSocket模块来实现WebSocket通信。Spring Boot是基于Spring框架构建的,它提供了一些方便的注解和自动配置来简化WebSocket的开发。@MessageMapping注解是Spring Boot提供的一个重要的注解之一,它可以帮助我们处理WebSocket消息。本文将介绍@MessageMapping注解的原理及使用方法。
✅ Java 开发工程师,从事 Web 应用程序的研发,擅长 Spring、SpringBoot 等技术。 ✅ 热爱编程,业余时间学习新知识,通过 CSDN 记录学习心得和笔记内容。 09-10
一个Java小白的学习之路 个人博客 youngljx.top SpringBoot自动化配置后使用WebSocket很方便,通过@MessageMapping 注解配置消息接口,通过@SendTo或者SimpMessageingTemplate进行消息转发,通过简单的配置就能实现点对点,点对面的消息发送。 1.添加依赖: <dependency> @MessageMapping("/send/{id}") @SendTo("/topic/{id}") public MessageEntity sendMesage(@Payload MessageEntity message){ return message; 但是前端使用 : stompClient.send('/app/send...
客户端可以有多种不同的方式,发送消息给server,包括 SUBSCRIBE和 SEND. @SubscribeMapping("/topic/topic1") 标注的方法,只会处理SUBSCRIBE发送的消息。 @MessageMapping("/topic/topic1") 标注的方法,只会处理SEND发送的消息。 在客户端和server建立连接后,涉及到很多不同形式的消息转发,这个可以参考R...
springbootwebsocket配置见 https://blog.csdn.net/u011943534/article/details/81007002 1、发送数据携带用户ID 携带的用户ID可以直接拿到给MessageMapping注解的函数注入,后端可以使用这个ID双向通信 需要定义一个实体实现Principal,实现getName()方法 @Getter @Setter publ...
Spring Boot,要实现WebSocket通信,需要使用到WebSocket相关的注解。 首先,需要在配置类上添加@EnableWebSocket注解,这样Spring Boot就会自动配置WebSocket的支持。 接下来,可以在需要使用WebSocket的类的方法上添加@WebSocketHandler注解,将该方法声明为WebSocket处理器。在这个方法,可以通过WebSocketSession对象实现与客户端的通信。 同时,还可以在类或方法级别上使用@MessageMapping注解,来定义处理客户端发送消息的路径。 另外,还可以使用@SubscribeMapping注解,来定义订阅某个主题的方法。 除了以上提到的注解,还有一些其他的相关注解,如: - @OnOpen: 当WebSocket连接打开时,执行的方法 - @OnMessage: 当收到客户端发送的消息时,执行的方法 - @OnClose: 当WebSocket连接关闭时,执行的方法 - @OnError: 当WebSocket连接出现错误时,执行的方法 在编写WebSocket的处理器方法时,可以使用这些注解来定义相应的操作。 总之,在Spring Boot实现WebSocket通信使用注解有:@EnableWebSocket、@WebSocketHandler、@MessageMapping、@SubscribeMapping、@OnOpen、@OnMessage、@OnClose、@OnError等。通过合理地使用这些注解,可以方便地实现WebSocket通信。