java Spring Webflux控制器:获取React链中的原始请求对象

qlvxas9a  于 2023-01-07  发布在  Java
关注(0)|答案(1)|浏览(257)

我有一个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请求中收到的原始请求。我可以在服务类中的响应对象中设置它并访问它,但这有点笨拙。

nxagd54h

nxagd54h1#

@RequestBody Mono<MyRequest> myRequestMono

实际上在你的例子中,没有必要在控制器中使用Mono作为@RequestBody,你可以显式地用你的对象替换它,不会有阻塞。为了进一步的处理,只需要用Mono.just() Package 它
因此,您可以在链中的运算符中使用文本对象,而不必担心阻塞
根据WebFlux文档:

  • 请求主体可以是以下方式之一,并且它将在注解和函数式编程模型中自动解码:*
Account account
    • 在调用控制器之前,帐户被反序列化而不阻塞。*
Mono<Account> account
    • 控制器可以使用Mono来声明要在帐户反序列化之后执行的逻辑。*
Flux<Account> accounts
    • 输入流方案。*

相关问题