常见陷阱与排查

1. No handler registered for request

**原因**:Handler 未注册到 DI 容器。

**排查**: - 是否使用了 `#[handler]` 或 `#[handler(inject)]`? - 是否手动注册为 `dyn IRequestHandler<T, R>`? - Handler 模块是否被 `mod handlers;` 引用?

2. route not found (404)

**原因**:路由未正确收集。

**排查**: - `#[get]` 是否标注在 `impl IRequest<T>` 上(不是 struct)? - 路径是否与实际请求匹配? - 模块是否参与编译链接(inventory 需要)?

3. #[handler] 编译失败

**原因**:Handler 未实现 `Default`。

**解决**:有依赖的 Handler 使用 `#[inject]` + `#[handler(inject)]`。

4. 类型不匹配

**原因**:`IRequest<T>` 的 T 与 `IRequestHandler<T, R>` 的 R 不一致。

// ❌
impl IRequest<String> for GetUserRequest {}
impl IRequestHandler<GetUserRequest, UserDto> for GetUserHandler {}

// ✅
impl IRequest<UserDto> for GetUserRequest {}
impl IRequestHandler<GetUserRequest, UserDto> for GetUserHandler {}

5. 注册为具体类型

// ❌
svc.singleton(|_| Arc::new(HelloHandler::default()))

// ✅
svc.singleton::<dyn IRequestHandler<HelloRequest, String>>(
    |_| Arc::new(HelloHandler::default())
)

6. 401/403 授权问题

- 是否启用了 `add_authentication()`? - JWT Secret 是否一致? - `#[authorize(role = "...")]` 的 role 是否与 token 中的 roles 匹配?

排查流程

遇到错误 → 读错误消息 → 查本表 → 查对应章节 → 参考 Docbit 源码

小结

90% 的问题出在 Handler 注册和类型绑定上,掌握规则 1-5 可避免大部分陷阱。

下一节:[性能优化技巧](performance-tips.md)