You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OpenAPI Generator生成Rust服务端代码编译失败求助

解决OpenAPI Generator 7.20.0生成Rust服务端代码在1.95.0下的编译错误

问题概述

使用OpenAPI Generator 7.20.0从YAML规范生成Rust REST服务端代码后,在Rust 1.95.0环境下执行cargo build时出现三类重复编译错误,而客户端代码编译正常:

  • the trait bound 'HashMap<std::string::String, std::string::String>: FromStr' is not satisfied
  • the trait bound 'HashMap<std::string::String, std::string::String>: FromStr' doesn't implements 'std::fmt::Display'
  • no method named 'validate_regex' found for struct 'DateTime<Tz>' in the current scope(关联#[derive(Debug, Clone, PartialEq, Validate, serde::Serialize, serde::Deserialize)]派生宏)

解决方案

1. 调整Cargo.toml依赖版本

生成代码默认依赖的validator、chrono等crate版本与Rust 1.95.0存在兼容问题,需手动指定适配版本:

[dependencies]
# 确保validator和派生宏版本一致,适配新版Rust
validator = "0.16.0"
validator_derive = "0.16.0"
# 指定chrono的稳定兼容版本,开启必要特性
chrono = { version = "0.4.38", features = ["serde", "timezone"] }
# 其他依赖保持生成时的配置不变

2. 修复HashMap的FromStr/Display错误

标准库未为HashMap<String, String>实现FromStr和Display trait,需修改生成代码中参数解析逻辑:
找到服务端代码中尝试将字符串解析为HashMap的片段,替换为serde_json手动解析:

// 替换原错误代码:
// let map: HashMap<String, String> = param.parse()?;

// 修改为:
let map: HashMap<String, String> = serde_json::from_str(&param)
    .map_err(|e| {
        // 返回服务端自定义的BadRequest错误
        Error::BadRequest(format!("Invalid map format: {}", e))
    })?;

若涉及Display报错,避免直接打印HashMap,改用调试格式化:format!("{:?}", map)。

3. 修复DateTime的validate_regex错误

生成代码错误地为DateTime<Tz>字段添加了正则验证规则,而该类型本身不支持validate_regex方法,可通过两种方式修复:

  • 移除不必要的验证:删除结构体的Validate派生宏及对应字段的正则验证属性:
// 原代码
#[derive(Debug, Clone, PartialEq, Validate, serde::Serialize, serde::Deserialize)]
pub struct Event {
    #[validate(regex = r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$")]
    pub occur_time: DateTime<Tz>,
}

// 修改后
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct Event {
    pub occur_time: DateTime<Tz>,
}
  • 自定义验证逻辑:若需日期范围等验证,替换为自定义验证函数:
use validator::Validate;

#[derive(Debug, Clone, PartialEq, Validate, serde::Serialize, serde::Deserialize)]
pub struct Event {
    #[validate(custom = "validate_datetime_range")]
    pub occur_time: DateTime<Tz>,
}

fn validate_datetime_range(dt: &DateTime<Tz>) -> Result<(), validator::ValidationError> {
    // 示例:检查日期是否在未来
    if dt <= &chrono::Utc::now() {
        return Err(validator::ValidationError::new("datetime_must_be_future"));
    }
    Ok(())
}

4. 优化生成配置(可选)

为避免每次生成后手动修改代码,可在生成服务端时添加参数调整生成逻辑:

openapi-generator generate -i your-spec.yaml -g rust-server \
  --additional-properties=skipValidateRegex=true,validatorVersion=0.16.0

内容的提问来源于stack exchange,提问作者Marc Le Bihan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 06:33:12