【发布时间】:2018-10-26 16:42:22
【问题描述】:
我将 Spring Webflux 与 Tomcat servlet 容器(spring-boot-starter-web + spring-boot-starter-webflux)一起使用,我想获得以下信息结果:
如果flux of立即失败,我想发送给客户端响应码400
否则,我想发送响应代码 200 并流式传输通量
我尝试了不同的解决方案,但没有一个有效。 v1 和 v2 不发送预期的响应代码如果失败场景,v3 不流输出是快乐的场景。
我想“窥视”failFlux 上的异常并在发送响应代码 200 之前触发异常
@RequestMapping(produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
public class X {
Flux<String> happyFlux = Flux.generate(s -> s.next("x"));
Flux<String> failFlux = Flux.error(new ResponseStatusException(BAD_REQUEST));
//ok: flux is streamed
@RequestMapping("/v1/happy")
Flux<String> v1Happy() {
return happyFlux;
}
//nok: http status code is 200
@RequestMapping("/v1/fail")
Flux<String> v1Fail() {
return failFlux;
}
//ok: flux is streamed
@RequestMapping("/v2/happy")
Mono<ResponseEntity<Flux<String>>> v2Happy() {
return Mono.just(ResponseEntity.ok().body(happyFlux));
}
//nok: http status code is 200
@RequestMapping("/v2/fail")
Mono<ResponseEntity<Flux<String>>> v2Fail() {
return Mono.just(ResponseEntity.ok().body(failFlux));
}
//nok: flux is not streamed but collected on server side
@RequestMapping("/v3/happy")
Mono<ResponseEntity<List<String>>> v3Happy() {
return happyFlux.collectList().map(ResponseEntity::ok);
}
//ok: http status code is 400
@RequestMapping("/v3/fail")
Mono<ResponseEntity<List<String>>> v3Fail() {
return failFlux.collectList().map(ResponseEntity::ok);
}
附言。有趣的是,v1 和 v2 与 netty 一起工作(仅 spring-boot-starter-webflux)。
更新
我认为“偷窥”Flux 是不可能的。对于 servlet 堆栈,我真正需要的是在 Spring 中更好的 Flux 处理:https://jira.spring.io/browse/SPR-17440
【问题讨论】:
-
您能详细说明一下吗?什么时候抛出异常?那是什么例外?您能否在控制器返回的通量后添加
log()运算符后提供日志?您能否展示一个 HTTP 请求和响应的示例(带有标头和正文)? -
@BrianClozel,我完全重写了我的问题,我希望现在更清楚
标签: spring-webflux project-reactor