当前位置: 首页 > 知识库问答 >
问题:

特征“std::marker::Size”未针对自定义特征实现

蔡辰钊
2023-03-14

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

#[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的一个实例传递给我的验证处理程序,如下所示:

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)

使用验证具有以下签名:

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

根据我对这个答案的理解:https://stackoverflow.com/a/65646165,这应该可以让我使用< code > let provider _ object = provider . into _ inner()来访问provider对象;或类似的东西。

但是,我反而收到以下错误:

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::size做了一些研究,但我不知道如何使用它来解决这个问题。

共有1个答案

柯默
2023-03-14

参数提供者:web::Data

 类似资料:
  • 在Prestashop 1.7中,“自定义”特征值和非自定义特征值之间的技术区别是什么(我说的是布尔字段)? 因为为了在DB中保存特征值,我想在初始化我的对象的属性之后使用。其中包括布尔值

  • 将跟踪和跨度添加到Slf4J MDC,以便您可以从日志聚合器中的给定跟踪或跨度中提取所有日志。示例日志: 2016-02-02 15:30:57.902 INFO [bar,6bfd228dc00d216b,6bfd228dc00d216b,false] 23030 --- [nio-8081-exec-3] ... 2016-02-02 15:30:58.372 ERROR [bar,6bfd

  • 反缓存 anticache设置该选项后,它将删除可能引起服务器响应的Header(if-none-match和if-modified-since)304 not modified。当您要确保完全捕获HTTP交换时,这很有用。当您要确保服务器以完整的数据响应时,也经常在客户端重播期间使用它。 客户端重播 客户端重播可以做到:您提供了一个以前保存的HTTP对话,而mitmproxy则一个接一个地重播了

  • 我有一个设计问题,当使用类似的东西时: 我认为应该有一些更好的方法来实现这种参数化的特性。 我在std中没有找到好的示例(例如,在具有类似的关联类型的traits中没有实现)?

  •   特征缩放是用来统一资料中的自变项或特征范围的方法,在资料处理中,通常会被使用在资料前处理这个步骤。 1 动机   因为在原始的资料中,各变数的范围大不相同。对于某些机器学习的算法,若没有做过标准化,目标函数会无法适当的运作。举例来说,多数的分类器利用两点间的距离计算两点的差异, 若其中一个特征具有非常广的范围,那两点间的差异就会被该特征左右,因此,所有的特征都该被标准化,这样才能大略的使各特征