【问题标题】:How do I resolve "implementation of serde::Deserialize is not general enough" with actix-web's Json type?如何使用 actix-web 的 Json 类型解决“serde::Deserialize 的实现不够通用”?
【发布时间】:2021-08-19 18:11:02
【问题描述】:

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

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

【问题讨论】:

    标签: rust serde actix-web


    【解决方案1】:

    来自the actix-web documentation

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      • 2021-12-11
      • 2019-11-03
      • 2018-12-06
      • 2022-08-05
      • 1970-01-01
      相关资源
      最近更新 更多