![](/img/trans.png)
[英]How to get request body from ServerRequest object in Spring WebFlux reactive?
[英]Spring Webflux Controller : Get original request object in reactive chain
我有一个 spring webflux 项目。 我有这样的 controller 方法
@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));
}
我的服务 class 看起来像这样
public Mono<String> getUrl(Mono<MyRequest> myRequestMono) {
return myRequestMono.map(myRequest -> {
callSomething();
return "something";
});
}
我想要做的是,当我记录“生成 URL:成功”行时,我想在通过请求进入的 MyRequest object 中记录一个字段。 如何在.doOnNext
中访问它
我看到我可以在上下文中设置此值并使用transformDeferredContextual
访问它。
我通过实现WebFilter
并将其添加到那里进行了尝试,但无法在 controller 中真正访问它
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 请求中收到的原始请求。 我可以在服务 class 中的响应 object 中设置它并访问它,但这有点老套。
@RequestBody Mono<MyRequest> myRequestMono
实际上,在您的情况下,无需在 controller 中使用Mono
作为@RequestBody
,您可以明确地将其替换为您的 object,不会出现阻塞。 为了进一步处理,只需用Mono.just()
包装它
因此,您可以在链中的运算符中使用文字 object 而不必担心阻塞
根据 WebFlux 文档:
请求体可以是以下方式之一,它会在注解和函数式编程模型中自动解码:
Account account
—在调用 controller 之前,帐户在没有阻塞的情况下被反序列化。
Mono<Account> account
— controller 可以使用 Mono 声明帐户反序列化后要执行的逻辑。
Flux<Account> accounts
—输入流场景。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.