【问题标题】:The trait `std::marker::Sized` is not implemented for custom trait没有为自定义 trait 实现 trait `std::marker::Sized`
【发布时间】:2024-03-08 21:25:02
【问题描述】:

我有这样的提供程序设置:

#[async_trait]
pub trait AsyncKeyProvider {
    async fn get_key_async(&mut self, key_id: &str) -> Result<Option<Jwk>, ()>;
}


#[derive(Clone)]
pub struct GoogleKeyProvider {
    cached: Option<JwkSet>,
    expiration_time: Instant,
}


impl AsyncKeyProvider for GoogleKeyProvider {
    async fn get_key_async(&mut self, key_id: &str) -> Result<Option<Jwk>, ()> {
        {...}
    }
}

我正在尝试使用 actix-web 中的内置 app_data() 方法将 GoogleKeyProvider 的实例传递给我的 validate 处理程序,如下所示:

let key_provider: web::Data<dyn AsyncKeyProvider> = web::Data::from(Arc::new(GoogleKeyProvider));

let server = HttpServer::new(move || {
    App::new()
        .app_data(key_provider.clone())
        .wrap(Logger::default())
        .route("/ping", web::get().to(health_check))
        .route("/validate", web::post().to(validate))
})
.listen(listener)?
.run();
Ok(server)

validate 的签名为:

pub async fn validate(jwt_body: web::Json<JwtBody>, provider: web::Data<dyn AsyncKeyProvider>) -> impl Responder {
    {...}
}

据我从这个答案中了解到的:https://*.com/a/65646165,这应该做到这一点,以便我可以使用let provider_object = provider.into_inner(); 或类似的东西访问提供者对象。

但是,我却收到以下错误:

error[E0599]: the method `into_inner` exists for struct `actix_web::web::Data<dyn key_providers::key_providers::AsyncKeyProvider>`, but its trait bounds were not satisfied
  --> src\routes\validate.rs:26:36
   |
26 |     let provider_object = provider.into_inner()
   |                                    ^^^^^^^^^^ method cannot be called on `actix_web::web::Data<dyn key_providers::key_providers::AsyncKeyProvider>` due to unsatisfied trait bounds
   |
  ::: src\key_providers\key_providers.rs:53:1
   |
53 | pub trait AsyncKeyProvider {
   | -------------------------- doesn't satisfy `_: std::marker::Sized`
   |
   = note: the following trait bounds were not satisfied:
           `dyn key_providers::key_providers::AsyncKeyProvider: std::marker::Sized`

error[E0277]: the size for values of type `dyn key_providers::key_providers::AsyncKeyProvider` cannot be known at compilation time
   --> src\startup.rs:9:73
    |
9   |     let key_provider: web::Data<dyn AsyncKeyProvider> = web::Data::from(Arc::new(GoogleKeyProvider));
    |                                                                         ^^^^^^^^ doesn't have a size known at compile-time
    |
    = help: the trait `std::marker::Sized` is not implemented for `dyn key_providers::key_providers::AsyncKeyProvider`
note: required by `Arc::<T>::new`
   --> C:\Users\dantd\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\alloc\src\sync.rs:342:5
    |
342 |     pub fn new(data: T) -> Arc<T> {
    |     ^^^^^^^^^^^^^^^^^^^

谁能帮我弄清楚如何解决这个问题?我已经对std::marker::Sized 做了一些调查,但我不知道如何使用它来解决这个问题。

【问题讨论】:

  • 我包含了 actix-web 标签,因为这在技术上正在通过该框架的方法,但我有理由确定这将是我现在不理解的核心 Rust 东西,如果需要,请随意删除标签

标签: rust actix-web


【解决方案1】:

参数provider: web::Data&lt;dyn AsyncKeyProvider&gt; 在编译时没有已知的大小,因为它可以包含任何实现类型。您需要改用 web::Data&lt;std::boxed::Box&lt;dyn AsyncKeyProvider&gt;&gt; 类型。

【讨论】:

  • 这是否与into_inner 通话保持一致?如果我将参数交换为您提到的类型,则会收到此错误:expected struct key_providers::key_providers::GoogleKeyProvider found struct Arc&lt;Box&lt;dyn key_providers::key_providers::AsyncKeyProvider&gt;&gt;
  • 啊,对了,刚刚意识到这将是因为它仍在使用 trait,我需要强制它进入实现?
最近更新 更多