我有一个springwebflux项目。我有一个这样的控制器方法
@PostMapping("url")
public Mono<MyResponse> getMyResponse(@RequestBody Mono<MyRequest> myRequestMono) {
return urlService.getUrl(myRequestMono)
.doOnNext(url -> {
System.out.println("Generated URL: Successfully ");
})
.map(dto -> MyResponse.builder().url(dto).build())
.doOnError(e -> System.out.println("Error " + e));
}
我的服务类如下所示
public Mono<String> getUrl(Mono<MyRequest> myRequestMono) {
return myRequestMono.map(myRequest -> {
callSomething();
return "something";
});
}
我想做的是,当我记录行“生成的URL:成功”,我想记录通过请求传入的MyRequest对象中的字段。如何在.doOnNext
中访问该字段
我看到可以在上下文中设置这个值,并使用transformDeferredContextual
访问它。
我尝试过实现WebFilter
并将其添加到那里,但无法在控制器中真正访问它
urlService.getUrl(myRequestMono)
.transformDeferredContextual((stringMono, contextView) ->
stringMono
.doOnNext(url -> {
contextView.get("key") // cannot get the object from this.
System.out.println("Generated URL: Successfully ");
})
.map(dto -> MyResponse.builder().url(dto).build())
.doOnError(e -> System.out.println("Error occurred " + e)));
这是正确的方法吗?如果不是,我该如何处理这个问题。我需要访问我在.doOnNext
方法中的Http请求中收到的原始请求。我可以在服务类中的响应对象中设置它并访问它,但这有点笨拙。
1条答案
按热度按时间nxagd54h1#
实际上在你的例子中,没有必要在控制器中使用
Mono
作为@RequestBody
,你可以显式地用你的对象替换它,不会有阻塞。为了进一步的处理,只需要用Mono.just()
Package 它因此,您可以在链中的运算符中使用文本对象,而不必担心阻塞
根据WebFlux文档: