请问rsocket世界中@exceptionhandler的等价物是什么?

mqxuamgl  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(427)

关于如何拥有“控制器”级别的小问题 @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 我需要通过另一个机制?
谢谢你的帮助。

p4rjhz4m

p4rjhz4m1#

我相信同等的是 MessageExceptionHandler 如果 RSocket 正在运行WebSocket。
websockets异常处理
就像普通的springmvc一样,我们也可以处理异常。但是,我们现在必须使用@messageexceptionhandler注解,而不是使用@exceptionhandler注解。
所以像这样的方法是可行的:

@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 .
编辑——正如rossen的评论所说,messageexceptionhandler和正在使用的协议之间没有这样的联系,所以忽略上面的文本!。

相关问题