20

I'm writing a server using 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 {}

The compiler gives this error:

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`

How should I resolve this?

Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366
thesdev
  • 798
  • 9
  • 15

1 Answers1

31

From the actix-web documentation:

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

It basically says you can only use owned, not borrowed, data with the Json type if you want actix-web to extract types from the request for you. Thus you have to use String here:

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!()
}
xy2
  • 6,040
  • 3
  • 14
  • 34
edwardw
  • 12,652
  • 3
  • 40
  • 51
  • Why do many example use &'a str instead of String, especially for inserting data with Diesel ORM? Could someone kindly help to resolve same error in this case? – geobudex Feb 15 '23 at 05:53