繁体   English   中英

Spring Webflux Controller:在反应链中获取原始请求 object

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM