我正在使用WebFlux的功能端点.我使用onErrorResume将服务层发送的异常转换为HTTP错误代码:
public Mono
一旦服务返回Mono,它就能很好地工作.如果服务返回Flux,我该怎么办?
public Flux
编辑
我尝试了下面的方法,但不幸的是它不起作用. Flux.error不由onErrorResume处理并传播到框架.当在http响应的序列化期间取消装箱异常时,Spring Boot异常管理会捕获它并将其转换为500.
public Mono
我实际上对这个行为感到惊讶,那是一个bug吗?
最佳答案
您的第一个示例是使用Mono(即最多一个值),因此它与Mono< ServerResponse>一起使用时效果很好. – 该值将在内存中异步解析,根据结果,我们将返回不同的响应或手动处理业务异常.
在Flux(即0..N值)的情况下,在任何给定时间都可能发生错误.
在这种情况下,您可以使用collectList运算符来转换您的Flux< String>进入Mono< List< String>>,带有一个很大的警告:所有元素都将缓冲在内存中.如果您的控制器/客户端依赖于流数据,那么数据流非常重要,这不是最佳选择.
我担心我没有更好的解决方案来解决这个问题,原因如下:因为在Flux期间的任何时候都可能发生错误,所以无法保证我们可以更改HTTP状态和响应:事情可能已经被刷新了网络.使用Spring MVC并返回InputStream或Resource时已经是这种情况了.
Spring Boot错误处理功能尝试编写错误页面并更改HTTP状态(请参阅ErrorWebExceptionHandler并实现类),但如果响应已提交,它将记录错误信息并让您知道HTTP状态可能是错误的.