关于如何拥有“控制器”级别的小问题 @ExceptionHandler
,但请给我一杯咖啡。
有点天真,我试着有一个控制器级别 ExceptionHandler
在我的rsocket应用程序中包含以下内容(与任何其他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
我需要通过另一个机制?
谢谢你的帮助。
1条答案
按热度按时间p4rjhz4m1#
我相信同等的是
MessageExceptionHandler
如果RSocket
正在运行WebSocket。websockets异常处理
就像普通的springmvc一样,我们也可以处理异常。但是,我们现在必须使用@messageexceptionhandler注解,而不是使用@exceptionhandler注解。
所以像这样的方法是可行的:
请注意
RSocket
是一种在websockets上工作的协议,但也可以使用纯tcp等。在这个特定的例子中,似乎你的rsocket在ws之上,所以@MessageExceptionHandler
是正确的注解(不是作为rsocket,而是作为websocket)。如果通过tcp运行,则可能必须使用旧的@ExceptionHandler
.编辑——正如rossen的评论所说,messageexceptionhandler和正在使用的协议之间没有这样的联系,所以忽略上面的文本!。