Return 来自 Spring 响应式 POST 请求的 flatMap 输出

Return output of flatMap from Spring Reactive POST request

我正在尝试使用 Spring WebFlux 响应式编程构建 POST 请求。下面是我的处理程序代码:

public Mono<ServerResponse> getDataPOST(ServerRequest request) {
    Mono<Request> requestBodyMono = request.bodyToMono(Request.class);
    Mono<ServerResponse> responseBodyMono =  requestBodyMono.flatMap(requestBodyObj -> {
        Mono<ServerResponse> response = someFunction(); //Returns Mono<ServerResponse>
        return response;
    });
    return responseBodyMono;
} 

public Mono<ServerResponse> someFunction() {
    //..Some processing..
    String body = "Some body after processing";
    return ServerResponse.ok().bodyValue(body);
}

代码编译时没有错误,但是当我 运行 并调用请求时,我得到一个空响应。这是因为我的 responseBodyMono 没有得到任何数据。调试后发现flatMap方法里面的代码没有执行(可能是async的原因?)。如何正确返回响应?

在你订阅之前,反应式不会发生任何事情。您需要使用 flatMapmap 等反应运算符来链接 async/sync 函数。例如,在您的情况下,它看起来像

public Mono<ServerResponse> getDataPOST(ServerRequest request) {
    return request.bodyToMono(Request.class)
            .flatMap(requestBodyObj -> someFunction());
}

private Mono<ServerResponse> someFunction() {
    //..Some processing..
    String body = "Some body after processing";
    return ServerResponse.ok().bodyValue(body);
}

我意识到 flatMap 只有 运行 如果 POST 正文具有从请求中访问的所有参数。我发送的是一个空主体,因此没有调用 flatMap 函数,而是返回了一个简单的 200 OK 响应。如果你发送 incorrect/incomplete 参数,它会自动给出错误的请求响应。