Deserialize的实现不够通用

Deserialize的实现不够通用

本文介绍了如何解决"serde :: Deserialize的实现不够通用"?使用actix-web的Json类型?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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 {}

编译器给出此错误:

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:

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

这篇关于如何解决"serde :: Deserialize的实现不够通用"?使用actix-web的Json类型?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-02 11:19