Open1

Axum (Rust)でのコンパイルエラーとその解決法

hitochan777hitochan777

コード

PersonのVecを得るようなGETエンドポイントを定義した。

pub async fn get_persons(
    state: State<AppState>,
    Query(query): Query<QueryData>,
) -> (StatusCode, Json<Vec<Person>>) {
  // 略
}
    let app = Router::new()
        .route("/person", get(get_persons))
        .with_state(state);

エラー

コンパイルで下記エラーが発生。

error[E0277]: the trait bound `fn(axum::extract::State<AppState>, axum::extract::Query<QueryData>) -> impl futures_util::Future<Output = (StatusCode, axum::Json<std::vec::Vec<Change>>)> {get_persons}: Handler<_, _, _>` is not satisfied
   --> src/main.rs:50:32
    |
50  |         .route("/person", get(get_persons))
    |                            --- ^^^^^^^^^^^ the trait `Handler<_, _, _>` is not implemented for fn item `fn(axum::extract::State<AppState>, axum::extract::Query<QueryData>) -> impl futures_util::Future<Output = (StatusCode, axum::Json<std::vec::Vec<Person>>)> {get_persons}`

解決法

PersonがSerializableじゃなかったのが原因 #[derive(Serialize)] をつければコンパイル通るようになった。

#[derive(Serialize)]
pub struct Person {
  // 略
}