Rocket 0.5中rocket_contrib::Json返回值报Responder未实现错误如何解决
问题根因
你当前遇到的报错是Rocket版本不兼容导致的:你使用的Rocket核心库为0.5.0-rc.1版本,而引入的rocket_contrib是0.4.x版本,二者大版本不匹配。0.4版本rocket_contrib提供的Json类型无法适配0.5版本Rocket定义的Responder trait,哪怕你的结构体正确实现了Serialize/Deserialize trait也会报trait未实现的错误。你此前查阅到的解决方案多针对Rocket 0.4版本,不适用于0.5及以上版本。
解决方案
按以下步骤修改即可解决问题:
- 移除Cargo.toml中
rocket_contrib相关的全部依赖配置,Rocket 0.5版本开始已经将JSON支持内置到核心库,无需额外引入rocket_contrib。 - 给Cargo.toml中的Rocket依赖开启json功能,修改后的配置如下:
rocket = { version = "0.5.0-rc.1", features = ["json"] }
- 修改代码中JSON相关的导入路径,替换原有的rocket_contrib导入:
// 替换原来的 use rocket_contrib::json::Json; use rocket::serde::json::Json; // 可以直接使用Rocket重新导出的serde,避免版本不匹配问题 use rocket::serde::{Deserialize, Serialize};
- (可选)给结构体添加serde crate标注,彻底避免serde版本冲突:
#[derive(Debug, Serialize, Deserialize)] #[serde(crate = "rocket::serde")] pub struct MyStruct;
修改完成后重新执行cargo build,报错即可消除,Json<MyStruct>可以正常作为请求处理器的返回类型使用。
内容的提问来源于stack exchange,提问作者Sigbjørn Berdal
相关产品推荐
相关产品推荐

