Dify中自定义工具类的类型
在dify的自定义工具类中定义了如下的json schema格式:
{"openapi": "3.1.0","info": {"title": "电网项目数据查询接口","description": "提供电网项目相关信息查询功能,支持按多种条件筛选","version": "v1.0.0"},"servers": [{"url": "***"}],"paths": {"***": {"post": {"description": "查询电网项目信息","operationId": "GetProjectInfo","parameters": [{"name": "PROJECTNAME","in": "query","description": "项目名称(示例:110kV梁营至高桥110kV线路单线开断环入安澜变工程(架空),类型:text)","required": false,"schema": {"type": "string"}},{"name": "PROJECTTYPE","in": "query","description": "项目类型(单项工程/输变电工程,类型:varchar)","required": false,"schema": {"type": "string"}},{"name": "TYPE","in": "query","description": "工程类型(示例:架空线路工程/110千伏工程/间隔扩建 /间隔改造/架空-电缆部分/变电站新建 类型:varchar)","required": false,"schema": {"type": "string"}},{"name": "VOLTAGE","in": "query","description": "电压等级(取值:110kV/35kV/220kV/500kV 类型:varchar)","required": false,"schema": {"type": "string"}},{"name": "MANAGER_UNIT","in": "query","description": "管理部门(示例:苏州、南京,类型:varchar)","required": false,"schema": {"type": "string"}},{"name": "DESIGN_UNIT","in": "query","description": "设计单位(示例:南京中儒电力设计有限公司,类型:varchar)","required": false,"schema": {"type": "string"}},{"name": "REVIEW_UNIT","in": "query","description": "评审单位(示例:省经研院规划评审中心,类型:varchar)","required": false,"schema": {"type": "string"}},{"name": "CONTACT_MAN","in": "query","description": "联系人(示例:潘芸13862109602,类型:varchar)","required": false,"schema": {"type": "string"}},{"name": "ITEMPHASE","in": "query","description": "项目阶段(取值:初设/可研 类型:varchar)","required": false,"schema": {"type": "string"}},{"name": "REVIEWBACK","in": "query","description": "评审退回状态(示例:退回,类型:varchar)","required": false,"schema": {"type": "string"}},{"name": "FLOW_STATE","in": "query","description": "流转状态(取值:资料上报/收口资料上传/评审结束/正式评审记录上传/收口资料审核/收口审核/计划专责计划审核/预审意见填写/正式评审/评审通过 类型:varchar)","required": false,"schema": {"type": "string"}},{"name": "TURN_STATE","in": "query","description": "流转状态(取值:未结束流转/已结束流转 类型:varchar)","required": false,"schema": {"type": "string"}},{"name": "FORMAL_STATE","in": "query","description": "正式评审状态(取值:未结束/已结束/已结束评审 类型:varchar)","required": false,"schema": {"type": "string"}},{"name": "ITEM_STATE","in": "query","description": "项目状态(取值:通过/未申报/未提交/退回完善/不通过 类型:varchar)","required": false,"schema": {"type": "string"}},{"name": "INNER_STATE","in": "query","description": "匹配计划内项目状态(取值:已匹配/未匹配 类型:varchar)","required": false,"schema": {"type": "string"}},{"name": "PLAN_START_TIME","in": "query","description": "计划开始时间范围(示例:[\"2020-01-01\",\"2023-09-30\"],类型:varchar,格式:时间范围)","required": false,"schema": {"type": "string"}},{"name": "REVIEW_TIME","in": "query","description": "评审时间范围(示例:[\"2018-01-03\",\"2024-09-02\"],类型:varchar,格式:时间范围)","required": false,"schema": {"type": "string"}},{"name": "PLAN_REVIEW_TIME","in": "query","description": "计划评审时间范围(示例:[\"2018-01-03\",\"2024-09-02\"],类型:varchar,格式:时间范围)","required": false,"schema": {"type": "string"}},{"name": "ESTIMATE_STATE","in": "query","description": "文件评审阶段(示例:送审,类型:varchar,注释:文件评审阶段)","required": false,"schema": {"type": "string"}}],"deprecated": false}}},"components": {"schemas": {}}
}
由于刚刚接触后端的报错如下:
2025-08-03T09:14:57.351+08:00 WARN 3049334 --- [0.0-8089-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public org.springframework.http.ResponseEntity<com.project.filter.dto.FilterResponse> com.project.filter.controller.FilterTestCtroller.filterData(java.util.Map<java.lang.String, java.lang.Object>)]
大致的错误说的就是:在我的 Spring Boot 应用中,客户端发送的请求缺少了必要的请求体(request body),具体来说就是在FilterTestCtroller
控制器中的filterData
方法期望接收一个Map<String, Object>
类型的请求体,但客户端在发送请求时没有提供这个请求体,导致 Spring 无法解析请求内容,从而抛出HttpMessageNotReadableException
异常。
修改如下后即可正常测试:
{"openapi": "3.1.0","info": {"title": "电网项目数据查询接口","description": "提供电网项目相关信息查询功能,支持按多种条件筛选","version": "v1.0.0"},"servers": [{"url": "***"}],"paths": {"***": {"post": {"description": "查询电网项目信息","operationId": "GetProjectInfo","requestBody": {"required": false,"content": {"application/json": {"schema": {"type": "object","properties": {"PROJECTNAME": {"type": "string","description": "项目名称(示例:110kV梁营至高桥110kV线路单线开断环入安澜变工程(架空),类型:text)"},"PROJECTTYPE": {"type": "string","description": "项目类型(单项工程/输变电工程,类型:varchar)"},"TYPE": {"type": "string","description": "工程类型(示例:架空线路工程/110千伏工程/间隔扩建 /间隔改造/架空-电缆部分/变电站新建 类型:varchar)"},"VOLTAGE": {"type": "string","description": "电压等级(取值:110kV/35kV/220kV/500kV 类型:varchar)"},"MANAGER_UNIT": {"type": "string","description": "管理部门(示例:苏州、南京,类型:varchar)"},"DESIGN_UNIT": {"type": "string","description": "设计单位(示例:南京中儒电力设计有限公司,类型:varchar)"},"REVIEW_UNIT": {"type": "string","description": "评审单位(示例:省经研院规划评审中心,类型:varchar)"},"CONTACT_MAN": {"type": "string","description": "联系人(示例:潘芸13862109602,类型:varchar)"},"ITEMPHASE": {"type": "string","description": "项目阶段(取值:初设/可研 类型:varchar)"},"REVIEWBACK": {"type": "string","description": "评审退回状态(示例:退回,类型:varchar)"},"FLOW_STATE": {"type": "string","description": "流转状态(取值:资料上报/收口资料上传/评审结束/正式评审记录上传/收口资料审核/收口审核/计划专责计划审核/预审意见填写/正式评审/评审通过 类型:varchar)"},"TURN_STATE": {"type": "string","description": "流转状态(取值:未结束流转/已结束流转 类型:varchar)"},"FORMAL_STATE": {"type": "string","description": "正式评审状态(取值:未结束/已结束/已结束评审 类型:varchar)"},"ITEM_STATE": {"type": "string","description": "项目状态(取值:通过/未申报/未提交/退回完善/不通过 类型:varchar)"},"INNER_STATE": {"type": "string","description": "匹配计划内项目状态(取值:已匹配/未匹配 类型:varchar)"},"PLAN_START_TIME": {"type": "string","description": "计划开始时间范围(示例:[\"2020-01-01\",\"2023-09-30\"],类型:varchar,格式:时间范围)"},"REVIEW_TIME": {"type": "string","description": "评审时间范围(示例:[\"2018-01-03\",\"2024-09-02\"],类型:varchar,格式:时间范围)"},"PLAN_REVIEW_TIME": {"type": "string","description": "计划评审时间范围(示例:[\"2018-01-03\",\"2024-09-02\"],类型:varchar,格式:时间范围)"},"ESTIMATE_STATE": {"type": "string","description": "文件评审阶段(示例:送审,类型:varchar,注释:文件评审阶段)"}}}}}},"deprecated": false}}},"components": {"schemas": {}}
}
问题说明:
修改后的 OpenAPI 规范与之前的版本相比,核心区别在于参数传递方式的变更。
1. 参数位置的根本变化
原版本:所有参数定义在
parameters
数组中,且in: "query"
,表示参数通过URL 查询字符串传递(即拼接在 URL 末尾,格式如?PROJECTNAME=xxx&VOLTAGE=110kV
)。修改后:移除了
parameters
数组,所有参数迁移至requestBody
中,通过请求体(JSON 格式) 传递(参数包含在 HTTP 请求的 body 中,而非 URL)。
2.结构上的具体差异
对比项 原版本 修改后版本 参数容器 使用 parameters
数组定义每个参数使用 requestBody.content.application/json.schema.properties
定义参数参数传递载体 URL 查询字符串 请求体(JSON 格式) 前端请求格式 POST /api/filter/search?PROJECTNAME=xxx
POST /api/filter/search
,body 为{"PROJECTNAME":"xxx"}
与后端的兼容性 需后端用 @RequestParam
接收参数需后端用 @RequestBody
接收参数