ServerResponse returns 执行 Mono 之前

ServerResponse returns before execution of Mono

我正在尝试验证请求正文,然后根据它 return 错误请求或进一步处理。问题是未执行继续流程。我附上了我尝试过的两个解决方案:

解决方案 1

public Mono<ServerResponse>  startOrder(ServerRequest request) {
     return request.bodyToMono(OrderDto.class)
                        .map(order -> Utils.validate(order))
                        .flatMap(listErrors -> {
                            if(listErrors.isEmpty()){
                                Mono<OrderResponse> orderResponseMono = this.service.startOrder(request.bodyToMono(OrderDto.class));
                                return ServerResponse.ok().body(orderResponseMono, OrderResponse.class);
                            }
                            Mono<OrderResponse> res = Mono.just(new OrderResponse(HttpStatus.BAD_REQUEST.value(), new ApiError(list.toString())));
                            return ServerResponse.badRequest().body(res, OrderResponse.class);
                        });
}

解决方案 2

return request.bodyToMono(OrderDto.class)
                .map(tt -> Utils.validate(tt))
                .filter(res -> !res.isEmpty())
                .map(r -> new OrderResponse(HttpStatus.BAD_REQUEST.value(), new ApiError("validation errors")))
                .switchIfEmpty(this.service.initOrder(request.bodyToMono(OrderDto.class), HeaderValues.create(request.headers())))
                .flatMap(res -> ServerResponse.badRequest().body(Mono.just(res), OrderResponse.class));

验证方法

public static List<String> validate(OrderDto request) {
        List<String> result = new ArrayList<>();
        if(request.getId == null){
            result.add("Id should not be null");
            
        }
        if(request.getTitle() == null){
               result.add("Title should not be null");
        }
        
         if(request.getDescription() == null){
               result.add("Description should not be null");
        }
        return result;
    }

当验证成功时,包含结果的正文被 return 编辑,但失败时则不会。

什么会导致Mono不执行?

您遇到的问题是您试图通过在代码中调用 response.bodyToMono(OrderDTO.class) 两次来使用两次响应。

一旦您从响应中使用了正文,服务器将能够关闭与被调用系统的连接。

如果您多次调用它,它会(可能未检查或验证)return Mono.empty() 这意味着它不会按预期继续流程。

您应该养成尽快使用响应主体的习惯,以便服务器可以关闭连接以释放资源,而不是绕过响应对象。

由于我们正在使用流,因此在使用响应之前不会释放连接。