fix(mcp): 修正启动顺序——工具注册必须先于作用域绑定

根因(源码级):ToolSyncService 没有 @Order,默认 LOWEST_PRECEDENCE(最后执行);
ScopeToolSyncService 写了 @Order(2)(最先执行)。于是绑定跑在注册之前:

- tool 表里已有的工具 → 能查到 → 绑上(实测 3 个)
- 本次启动才注册的工具 → 查不到 → 跳过(district.paper.statistics.query)

现象完全对应:同一批 4 个工具,3 个进作用域,1 个缺失。

修复:给 ToolSyncService 显式 @Order(1),ScopeToolSyncService 保持 @Order(2),
并在注释里写清依赖关系,避免后来者再改错。

验证:编译通过;ScopeToolSyncServiceTest 5 例全过。
This commit is contained in:
xiaoqu-ai
2026-10-21 13:41:35 +08:00
parent a407870547
commit 663990e892
2 changed files with 3 additions and 1 deletions
@@ -35,7 +35,7 @@ import java.util.List;
* <p>安全约束:只新增、不删除;作用域或工具不存在时记警告并跳过(不阻断启动)。</p>
*/
@Component
@Order(2) // 必须在 ToolSyncService(@Order 缺省最低)之后,确保 tool 表已有记录
@Order(2) // 必须在 ToolSyncService(@Order(1)) 之后:它负责把工具写进 tool 表
public class ScopeToolSyncService implements ApplicationRunner {
private static final Logger log = LoggerFactory.getLogger(ScopeToolSyncService.class);
@@ -7,6 +7,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
@@ -20,6 +21,7 @@ import java.util.Objects;
* 但保留管理员手动设置的 status,且不删除任何已有工具。
*/
@Component
@Order(1) // 必须先于 ScopeToolSyncService(2):后者按 tool 表里的 name 建立作用域绑定
public class ToolSyncService implements ApplicationRunner {
private static final Logger log = LoggerFactory.getLogger(ToolSyncService.class);