请问 RSocket 世界中 @ExceptionHandler 的等价物是什么?

What is the equivalent of @ExceptionHandler in RSocket world please?

关于如何拥有“控制器”级别的小问题@ExceptionHandler,但对于 RSocket,请。

有点天真,我尝试在我的 RSocket 应用程序中使用以下控制器级别 ExceptionHandler。 (与任何其他 MVC/Webflux 应用程序一样)

    @ExceptionHandler
    public Mono<ResponseEntity<String>> exception(final Exception exception) {
        return Mono.just(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(exception.getMessage()));
    }

到目前为止,我没有看到这种“捕获”任何东西。因为我一直看到这个奇怪的错误。

io.netty.util.IllegalReferenceCountException: refCnt: 0
    at io.rsocket.util.ByteBufPayload.ensureAccessible(ByteBufPayload.java:208) ~[rsocket-core-1.1.0.jar:na]
    at io.rsocket.util.ByteBufPayload.sliceData(ByteBufPayload.java:155) ~[rsocket-core-1.1.0.jar:na]
    at org.springframework.messaging.rsocket.PayloadUtils.retainDataAndReleasePayload(PayloadUtils.java:54) ~[spring-messaging-5.3.2.jar:5.3.2]
    at org.springframework.messaging.rsocket.annotation.support.MessagingRSocket.retainDataAndReleasePayload(MessagingRSocket.java:184) ~[spring-messaging-5.3.2.jar:5.3.2]
    at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:113) ~[reactor-core-3.4.1.jar:3.4.1]

所以我想知道,我做错了吗,或者,RSocket 不支持 @ExceptionHandler,我需要通过其他机制吗?

感谢您的帮助。

我相信如果 RSocket 在 websockets 上 运行 等价于 MessageExceptionHandler

WebSockets Exception handling

Just like regular Spring MVC, we can handle exceptions as well. However, rather than using the @ExceptionHandler annotation, we now have to use the @MessageExceptionHandler annotation.


所以这样的事情会起作用:

@MessageExceptionHandler
public Mono<ResponseEntity<String>> exception(final Exception exception) 
{
    return Mono.just(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                                    .body(exception.getMessage()));
}

请注意,RSocket 是一种在 WebSockets 上工作的协议,但也适用于普通 TCP 等。在这种特定情况下,您的 RSocket 似乎在 WS 之上,因此 @MessageExceptionHandler 是正确的注释(不是作为 rsocket,而是作为 websocket)。如果 运行 通过 TCP,您可能必须使用旧的 @ExceptionHandler.

edit -- 正如 Rossen 的评论所述,MessageExceptionHandler 和正在使用的协议之间没有这样的 link,所以忽略上面的文字!.