如何解决请问RSocket世界中@ExceptionHandler的等价物是什么?
关于如何拥有“控制器”级别 @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
。
就像普通的 Spring MVC 一样,我们也可以处理异常。 然而,现在我们不使用@ExceptionHandler注解 必须使用@MessageExceptionHandler 注释。
所以这样的事情会起作用:
@MessageExceptionHandler
public Mono<ResponseEntity<String>> exception(final Exception exception)
{
return Mono.just(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(exception.getMessage()));
}
请注意,RSocket
是一种通过 WebSocket 工作的协议,但也适用于普通 TCP 等。在这种特定情况下,似乎您的 RSocket 超过了 WS,因此 @MessageExceptionHandler
是正确的注释(不是 rsocket,而是充当 websocket)。如果通过 TCP 运行,您可能必须使用旧的 @ExceptionHandler
。
编辑 -- 正如罗森的评论所说,MessageExceptionHandler 和使用的协议之间没有这种联系,所以请忽略上面的文字! em>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。