From 8e5121ed0d70fdd9fa9c86b72d6fff75228c5192 Mon Sep 17 00:00:00 2001 From: figmar Date: Mon, 31 Aug 2026 14:11:43 +0800 Subject: [PATCH] =?UTF-8?q?M3=20fix:=20/sync=20=E7=AB=AF=E7=82=B9=E6=94=B9?= =?UTF-8?q?=20Mono=20=E8=BF=94=E5=9B=9E(WebFlux=20=E7=A6=81=20block)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rest/CasdoorSsoConfigController.java | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/backend/api-gateway/src/main/java/com/deepdata/gateway/interfaces/rest/CasdoorSsoConfigController.java b/backend/api-gateway/src/main/java/com/deepdata/gateway/interfaces/rest/CasdoorSsoConfigController.java index 08731b9..c18b399 100644 --- a/backend/api-gateway/src/main/java/com/deepdata/gateway/interfaces/rest/CasdoorSsoConfigController.java +++ b/backend/api-gateway/src/main/java/com/deepdata/gateway/interfaces/rest/CasdoorSsoConfigController.java @@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; import java.util.LinkedHashMap; import java.util.Map; @@ -57,30 +58,28 @@ public class CasdoorSsoConfigController { } /** - * 手动全量同步(admin only)。 + * 手动全量同步(admin only)。WebFlux 事件循环线程不可 block,返回 Mono。 */ @PostMapping("/sync") - public ResponseEntity>> sync(ServerWebExchange exchange) { + public Mono>>> sync(ServerWebExchange exchange) { if (!props.isEnabled() || !props.isAccountOnly()) { - return ResponseEntity.status(HttpStatus.FORBIDDEN) - .body(new Response<>("casdoor.disabled", "Casdoor 账号同步未启用", null)); + return Mono.just(ResponseEntity.status(HttpStatus.FORBIDDEN) + .body(new Response<>("casdoor.disabled", "Casdoor 账号同步未启用", null))); } String username = currentUsername(exchange); if (username == null || !isAdmin(username)) { log.warn("casdoor sync rejected: caller={}", username); - return ResponseEntity.status(HttpStatus.FORBIDDEN) - .body(new Response<>("casdoor.forbidden", "仅管理员可触发账号同步", null)); + return Mono.just(ResponseEntity.status(HttpStatus.FORBIDDEN) + .body(new Response<>("casdoor.forbidden", "仅管理员可触发账号同步", null))); } return syncService.syncFull() .map(summary -> ResponseEntity.ok(Response.ok(summary))) .onErrorResume(e -> { log.error("casdoor manual sync failed: {}", e.getMessage()); - return reactor.core.publisher.Mono.just( - ResponseEntity.status(HttpStatus.BAD_GATEWAY) - .body(new Response<>("casdoor.sync_failed", - "同步失败: " + e.getMessage(), null))); - }) - .block(); + return Mono.just(ResponseEntity.status(HttpStatus.BAD_GATEWAY) + .body(new Response<>("casdoor.sync_failed", + "同步失败: " + e.getMessage(), null))); + }); } private String currentUsername(ServerWebExchange exchange) {