Spring webflux 带电抗器的webflux在BodyTomo中不打印异常
我希望map或doOnError打印日志,但事实是它们都没有打印日志,这使得它们看起来都无法运行。如果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)
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
}