如何解决使用actix-web的Json类型时出现的“serde :: Deserialize的实现不够通用”的问题?

20

我正在使用actix-web编写一个服务器:

use actix_web::{post, web, Responder};
use serde::Deserialize;

#[derive(Deserialize)]
struct UserModel<'a, 'b> {
    username: &'a str,
    password: &'b str,
}

#[post("/")]
pub fn register(user_model: web::Json<UserModel>) -> impl Responder {}
编译器报错:
error: implementation of `user::_IMPL_DESERIALIZE_FOR_UserModel::_serde::Deserialize` is not general enough  
  --> src/user.rs:31:1  
   |  
31 | #[post("/")]  
   | ^^^^^^^^^^^^  
   |  
   = note: `user::UserModel<'_, '_>` must implement `user::_IMPL_DESERIALIZE_FOR_UserModel::_serde::Deserialize<'0>`, for any lifetime `'0`  
   = note: but `user::UserModel<'_, '_>` actually implements `user::_IMPL_DESERIALIZE_FOR_UserModel::_serde::Deserialize<'1>`, for some specific lifetime `'1`

我该如何解决这个问题?

1个回答

31

以下内容来自actix-web文档:

impl<T> FromRequest for Json<T>
where
    T: DeserializeOwned + 'static, 

基本上就是说,如果你想让actix-web从请求中提取类型,那么你只能使用自己拥有的数据而非借用数据与Json类型一起使用。因此,在这里你必须使用String

use actix_web::{post, web, Responder};
use serde::Deserialize;

#[derive(Deserialize)]
struct UserModel {
    username: String,
    password: String,
}

#[post("/")]
pub fn register(user_model: web::Json<UserModel>) -> impl Responder {
    unimplemented!()
}

为什么许多示例在使用 Diesel ORM 插入数据时会使用 &'a str 而不是 String?在这种情况下,有人能够帮忙解决相同的错误吗? - geobudex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接