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()
这意味着它不会按预期继续流程。
您应该养成尽快使用响应主体的习惯,以便服务器可以关闭连接以释放资源,而不是绕过响应对象。
由于我们正在使用流,因此在使用响应之前不会释放连接。
我正在尝试验证请求正文,然后根据它 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()
这意味着它不会按预期继续流程。
您应该养成尽快使用响应主体的习惯,以便服务器可以关闭连接以释放资源,而不是绕过响应对象。
由于我们正在使用流,因此在使用响应之前不会释放连接。