Spring webflux 带电抗器的webflux在BodyTomo中不打印异常

Spring webflux 带电抗器的webflux在BodyTomo中不打印异常,spring-webflux,Spring Webflux,我希望map或doOnError打印日志,但事实是它们都没有打印日志,这使得它们看起来都无法运行。如果bodyToMono抛出异常,如何打印 public Mono<ServerResponse> tryWebflux(ServerRequest request) { log.info("start controller"); Mono bodyMono = request.bodyToMono(HashMap.class)

我希望map或doOnError打印日志,但事实是它们都没有打印日志,这使得它们看起来都无法运行。如果
bodyToMono
抛出异常,如何打印

public Mono<ServerResponse> tryWebflux(ServerRequest request) {
        log.info("start controller");

        Mono bodyMono = request.bodyToMono(HashMap.class)
                .doOnError(e -> log.error("something wrong", e))
                .map(body -> {
                    log.info("in map");
                    return body;
                });
        bodyMono.log().subscribe(System.out::println);
        return ServerResponse.ok().build();
}

我猜这是因为这句话:

bodyMono.log().subscribe(System.out::println);
您可以看到,在大多数情况下,您从未在应用程序中订阅。订阅者是发起调用的人,在大多数情况下,这是调用客户机(前端、api调用方等)。您的服务器是发布者,在该服务器中,您希望构建一个事件链,基本上一个接一个地进行操作

在中间订阅你正在打破事件链。

尝试:

公共Mono tryWebflux(服务器请求){ 返回请求.bodytomino(HashMap.class) .doOnError(e->log.error(“出错了”,e)) .map(正文->{ 日志信息(“地图中”); 返回体; }).log()//我们登录,像以前一样链接 .then(ServerResponse.ok().build()); //在这里,我们使用then()关键字仍然在mono上保持链接 }
永远不要打破活动链是非常重要的。如果你看到自己在中间订阅,那么你可能做了一些错误的事情,除非你的应用程序是某物的发起人,或者是“消费者”。起初它不在那里。我想检查<代码> doOrror < /Cord>或<代码> map < /Cord>。你不应该在你的应用程序中间订阅。我的意思是,即使没有这个代码> BoDyMoo.Log.(),订阅(System .out::PrtLn);<代码>,日志仍然没有打印,比如语句没有运行,当您调试应用程序时?您发布的内容太少,响应看起来像?,谁在调用此代码?
bodyMono.log().subscribe(System.out::println);
public Mono<ServerResponse> tryWebflux(ServerRequest request) {
    return request.bodyToMono(HashMap.class)
            .doOnError(e -> log.error("something wrong", e))
            .map(body -> {
                log.info("in map");
                return body;
            }).log() // We log, chaining on as you did before
            .then(ServerResponse.ok().build()); 
            // Here we use the then() keyword to still keep chaining on the mono
}