java - 将错误消息从 SSE (Webflux) Spring Boot 应用程序传递到 Angular 7 前端

标签 java angular spring-boot spring-webflux server-sent-events

我的应用程序是一个具有多个端点的 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 类以获取异常详细信息?

最佳答案

服务器端事件使用开放的 HTTP 连接从服务器流式传输内容。根据 Eventsource 的 W3C 规范建立连接需要具有正确 Content-Type header 的 HTTP 200 OK 响应,HTTP 500、502、503、504 或任何其他网络错误将导致浏览器重新建立连接。如果以上情况均不满足,则使用 readyState = 'CLOSED' 触发错误事件。简而言之,onError 回调仅用于处理网络超时或访问控制问题。

不可能基于运行时异常发送不同的 HTTP 状态代码,因为您在建立连接时已经发送了 200 Ok。处理运行时错误的唯一方法是捕获异常并从服务器发送一个自定义命名事件,并根据该事件关闭 EvetSource

关于java - 将错误消息从 SSE (Webflux) Spring Boot 应用程序传递到 Angular 7 前端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55243391/

相关文章:

java - 扫描仪跳过新行

angular - Storybook 给出 "Can' t 解决 AppComponent 的所有参数“Angular 库中的错误

java - Spring boot 忽略附加属性文件

java - Android 模拟器无法模拟正确的密度或分辨率。可能是 surfaceview 实现问题

java - Spring RestTemplate 在点击 API 后抛出 403 Forbidden

angular - 如何在 Controller 中添加多个 Nestjs RoleGuard

javascript - TemplateUrl 找不到我的模板

java - org.springframework.context.ConfigurableApplicationContext 类型无法解析。它是从所需的 .class 文件中间接引用的

java - 获取和设置 session 值

java - 长与大整数