自定义特征未实现特征“std::marker::Sized”
The trait `std::marker::Sized` is not implemented for custom trait
我有这样的提供商设置:
#[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>, ()> {
{...}
}
}
我正在尝试将 GoogleKeyProvider
的实例传递给我的 validate
处理程序,使用 actix-web 中的内置 app_data()
方法,如下所示:
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 {
{...}
}
我从这个答案中了解到:,这个 应该 做到这一点,这样我就可以使用 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
进行了一些调查,但我不知道如何使用它来解决这个问题。
参数 provider: web::Data<dyn AsyncKeyProvider>
在编译时没有已知大小,因为它可以包含任何实现类型。您需要改用 web::Data<std::boxed::Box<dyn AsyncKeyProvider>>
类型。
我有这样的提供商设置:
#[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>, ()> {
{...}
}
}
我正在尝试将 GoogleKeyProvider
的实例传递给我的 validate
处理程序,使用 actix-web 中的内置 app_data()
方法,如下所示:
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 {
{...}
}
我从这个答案中了解到: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
进行了一些调查,但我不知道如何使用它来解决这个问题。
参数 provider: web::Data<dyn AsyncKeyProvider>
在编译时没有已知大小,因为它可以包含任何实现类型。您需要改用 web::Data<std::boxed::Box<dyn AsyncKeyProvider>>
类型。