首页 > 解决方案 > 如何使用 actix-web 的 Json 类型解决“serde::Deserialize 的实现不够通用”?

问题描述

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

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

标签: rustserdeactix-web

解决方案


文档actix-web

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

Json它基本上说,如果您想actix-web从请求中提取类型,您只能使用拥有的数据,而不是借用的数据。因此你必须在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!()
}

推荐阅读