如何在OpenAPI 3.0中定义带属性校验的必填requestBody?
我在OpenAPI 3.0中定义了如下接口及requestBody,已将ImportDataDTO的required设为true:
/data/{idParam}: put: tags: - Data parameters: - $ref: "./commonDTO.yaml#/components/parameters/dataIdParam" summary: My request description: |- Allows operator to import data. operationId: importData requestBody: $ref: "#/components/requestBodies/ImportDataDTO" requestBodies: ImportDataDTO: required: true content: application/json: schema: properties: name: type: string dataId: $ref: "./commonDTO.yaml#/components/schemas/dataID" requestHeader: $ref: "./commonDTO.yaml#/components/schemas/RequestHeaderDTO" dataDTO: $ref: "#/components/schemas/MyDataObj"
但使用cpp-pistache-server生成器生成的validate方法未对请求属性(如name、dataId、dataDTO等)进行必填校验,生成的代码如下:
bool ImportData_request::validate(std::stringstream& msg, const std::string& pathPrefix) const { bool success = true; const std::string _pathPrefix = pathPrefix.empty() ? "ImportData_request" : pathPrefix; return success; }
请问如何配置才能让生成的代码自动校验这些请求属性是否已设置?
你当前设置的required: true仅表示整个requestBody是必填项(即请求不能缺少body),但不会触发body内部属性的必填校验。要让cpp-pistache-server生成器自动生成属性校验代码,需要按以下步骤配置:
在schema层级添加
required数组,明确指定必填属性
修改ImportDataDTO的schema定义,新增required字段列出所有需要校验的属性:requestBodies: ImportDataDTO: required: true content: application/json: schema: type: object # 显式声明为object类型,部分生成器依赖这个标记生成校验逻辑 properties: name: type: string dataId: $ref: "./commonDTO.yaml#/components/schemas/dataID" requestHeader: $ref: "./commonDTO.yaml#/components/schemas/RequestHeaderDTO" dataDTO: $ref: "#/components/schemas/MyDataObj" required: # 新增:列出所有必填的属性名 - name - dataId - dataDTO递归配置嵌套schema的必填规则
如果dataID、RequestHeaderDTO、MyDataObj这些引用的schema内部也有需要校验的必填属性,必须在各自的schema定义中同样添加required数组,生成器才会递归生成嵌套属性的校验代码。确认生成器启用校验功能
部分OpenAPI生成器需要通过参数显式开启校验代码生成,你可以在生成命令中添加enableValidation=true参数:openapi-generator generate -g cpp-pistache-server -i your-spec.yaml -o output-dir --additional-properties=enableValidation=true
完成以上配置后,重新生成代码,ImportData_request::validate方法就会自动添加对name、dataId、dataDTO等属性的非空校验逻辑。
内容的提问来源于stack exchange,提问作者ventsyv

