当前位置: 首页 > 知识库问答 >
问题:

从WebSocket消息处理MethodArgumentNotValidException

湛光明
2023-03-14
@Controller
public class MessageThreadController {
    /* A plain XHR post request with a JSON body to match MessageThread. */
    @RequestMapping(
        headers={"Accept=application/hal+json", "Content-Type=application/json", "X-Requested-With=XMLHttpRequest"},
        method={RequestMethod.POST},
        produces="application/hal+json",
        value="/api/unsecure/thread/create")
    public HttpEntity createPost(@Valid @RequestBody MessageThread messageThread) throws Exception {
        return ResponseEntity.ok("valid");
    }

    /* The same request above but for WebSocket.*/
    @MessageMapping("/api/secure/thread/create")
    @SendToUser("/api/secure/broadcast")
    public HttpEntity createMessage(@Valid @RequestBody MessageThread messageThread) throws Exception {
        return ResponseEntity.ok("valid");
    }
}

我有一个@ControllerAdvise来捕获可能发生的异常:

@ControllerAdvice
public class MessageThreadControllerAdvice {
    private static final Logger log = LoggerFactory.getLogger(MessageThreadControllerAdvice.class);

    /* MessageThreadController.createPost() validation exception are handled here. */
    @ExceptionHandler(org.springframework.web.bind.MethodArgumentNotValidException.class)
    public void methodArgumentNotValidExceptionHandler(
        org.springframework.web.bind.MethodArgumentNotValidException e) {
        log.trace("methodArgumentNotValidExceptionHandler");
    }

    /* MessageThreadController.createMessage() validation exception are handled here. */
    @ExceptionHandler(org.springframework.messaging.handler.annotation.support.MethodArgumentNotValidException.class)
    @SendToUser("/api/secure/broadcast")
    public void methodArgumentNotValidWebSocketExceptionHandler(
        org.springframework.messaging.handler.annotation.support.MethodArgumentNotValidException e) {
        log.trace("methodArgumentNotValidWebSocketExceptionHandler");
    }

    /* All exceptions are handled here. */
    @ExceptionHandler
    @SendToUser("/api/secure/broadcast")
    public void exceptionHandler(Exception e) {
        log.trace("exceptionHandler");
    }
}

这里是有问题的对象:

@Getter @Setter
public class MessageThread {
    @Size(min=1, message="{validation.userIds.empty}")
    @NotNull(message="{validation.userIds.null}")
    private Set<BigInteger> userIds;
}

如果在MessageThreadController.createPost()MessageThreadController.createMessage()中发送以下JSON正文:

{"userIds":[]}

如何处理在websocket消息上引发的MethodArgumentNotValidException

共有1个答案

严成礼
2023-03-14

您可以使用@MessageExceptionHandler注释来注释@ControllerAdvise方法。

@ControllerAdvice
public class MessageThreadControllerAdvice {
    private static final Logger log = LoggerFactory.getLogger(MessageThreadControllerAdvice.class);

    /* MessageThreadController.createPost() validation exception are handled here. */
    @ExceptionHandler(org.springframework.web.bind.MethodArgumentNotValidException.class)
    public void methodArgumentNotValidExceptionHandler(
        org.springframework.web.bind.MethodArgumentNotValidException e) {
        log.trace("methodArgumentNotValidExceptionHandler");
    }

    /* MessageThreadController.createMessage() validation exception are handled here. */
    @MessageExceptionHandler(org.springframework.messaging.handler.annotation.support.MethodArgumentNotValidException.class)
    @SendToUser("/api/secure/broadcast")
    public void methodArgumentNotValidWebSocketExceptionHandler(
        org.springframework.messaging.handler.annotation.support.MethodArgumentNotValidException e) {
        log.trace("methodArgumentNotValidWebSocketExceptionHandler");
    }

    /* All exceptions are handled here. */
    @ExceptionHandler
    @SendToUser("/api/secure/broadcast")
    public void exceptionHandler(Exception e) {
        log.trace("exceptionHandler");
    }
}

这个注释也可以应用在@controller级别。

请注意,自Spring4.2以来,@ControllerAdvise级别支持此注释。

 类似资料:
  • 我每个websocket接收几十条消息,这些消息可能只差几毫秒就能到达。我需要用操作来处理这些数据,这些操作有时会花费一些时间(例如,在DB中的插入)。为了处理接收到的新消息,必须完成对前一个消息的处理。 我的第一个想法是用Node.js Bull(用Redis)准备一个队列,但恐怕太长了,无法运行。这些消息的处理必须保持快速。 我尝试使用JS迭代器/生成器(直到现在我还从未使用过),我测试了如下

  • 在FLTK中是通过Fl_Widegt::handle(),虚拟函数来处理系统的消息。我们可以查看Fltk的源代码来分析系统是怎样处理一些系统消息的,如按钮的消息处理 /******************************************************* Fl_Button中处理消息的代码,省略了具体的处理代码 *******************************

  • 我正在网上阅读苹果的文档 处理本地和远程通知 在我看来,它有相互矛盾的说法。有人能澄清这些困惑吗?现在让我们严格地说一下远程通知(与本地通知相比)。 文档称,如果按下通知上的操作按钮,它将调用application:didfishlaunchingwithoptions并传递通知负载。之后,它会说,如果应用程序在前台运行,它会通过应用程序:DidReceiveMemoteNotify:发送通知。这

  • Storm 通过 Trident 对保证消息处理提供了不同的 level ,包括 best effort(尽力而为),at least once (至少一次)和exactly once(至少一次). 这张页面描述如何保证至少处理一次. What does it mean for a message to be "fully processed"?(一条信息被完全处理是什么意思) 一个 tuple

  • 我是如何临时修复它的:考虑我已经实现了下面的方法 它向websocket会话发送一个TextMessage。我无法使整个方法同步,因为多个线程可以为不同的websocketSessions和消息调用它。我也不能将会话放在同步块中(尝试了但没有工作) 虽然,我这样解决了我的问题

  • 我是Netty的新手,需要以自定义方式处理消息。我有以下接口: 现在我从客户端收到一些数据,并希望对其进行处理。我正在实现