将错误消息从 SSE (Webflux) Spring Boot 应用程序传递到 Angular 7 前端
Posted
技术标签:
【中文标题】将错误消息从 SSE (Webflux) Spring Boot 应用程序传递到 Angular 7 前端【英文标题】:Passing error messages from SSE (Webflux) Spring Boot app to Angular 7 frontend 【发布时间】:2019-08-10 02:55:02 【问题描述】:我的应用程序是一个带有多个端点的 Spring Boot 应用程序。我们正在尝试使用 Webflux 添加启用 SSE 的端点。
用例:
第 1 步:前端向 POST 端点提交请求并获取唯一 ID。
第 2 步:前端使用 GET 端点获取处理后的结果(启用 SSE - Flux)
Angular 使用 EventSource 对象来使用 SSE 端点。它需要端点来生成文本/事件流。它适用于积极的测试用例。但是当服务抛出运行时异常时,Angular 前端无法获取 HTTP 状态代码和异常详细信息。它只是没有数据的错误。
抛出的异常:
@ResponseStatus(code = HttpStatus.NOT_FOUND)
public class RequestNotFoundException extends RuntimeException
private static final long serialVersionUID = 1L;
public RequestNotFoundException(String message)
super(message);
如this 中所述,返回Flux<ServerSentEvent>
并使用自定义事件终止通量:
Java 端点
@GetMapping(path= "id/async", produces=MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<Optional<ProcessedResult>>> getProcessedResultStream(
@PathVariable("id") @ApiParam(value = "The unique identifier of the request", required = true) String id)
throws InterruptedException
// Combining data and adding a disconnect event to handle at the frontend.
return Flux.concat(
Flux.just(ServerSentEvent.<Optional<ProcessedResult>>builder(service.getProcessedResult(id))
.build()),
Flux.just(ServerSentEvent.<Optional<ProcessedResult>>builder().event("disconnect").build()));
这有助于通过断开连接来关闭 UI 端的连接。但我的主要问题仍然悬而未决。我应该如何将错误消息传播回前端?所有其他(正常)端点使用上面给出的正确 HTTP 代码抛出自定义运行时异常。
我是否应该更改我的 ProcessedResult 类以获取异常详细信息?
【问题讨论】:
【参考方案1】:服务器端事件使用开放的 HTTP 连接从服务器流式传输内容。根据 W3C 规范 Eventsource HTTP 200 OK 响应需要一个正确的 Content-Type 标头来建立连接,HTTP 500, 502, 503, 504
或任何其他网络错误将导致浏览器重新建立连接。如果上述情况均不满足,则使用readyState = 'CLOSED'
触发错误事件。简而言之,onError
回调仅用于处理网络超时或访问控制问题。
无法根据运行时异常发送不同的 HTTP 状态代码,因为您在建立连接时已经发送了 200 Ok。处理运行时错误的唯一方法是捕获异常并从服务器和close
发送自定义命名事件EvetSource
基于此。
【讨论】:
以上是关于将错误消息从 SSE (Webflux) Spring Boot 应用程序传递到 Angular 7 前端的主要内容,如果未能解决你的问题,请参考以下文章