请问 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
。
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,所以忽略上面的文字!.
关于如何拥有“控制器”级别的小问题@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
。
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,所以忽略上面的文字!.