如何使用actix-web的Json类型解决"serde::D eserialize不够通用"的实现



我正在使用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`

我应该如何解决这个问题?

来自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!()
}

最新更新