Initial commit: MSH System\n\n- msh_single_uniapp: Vue 2 + UniApp 前端(微信小程序/H5/App/支付宝小程序)\n- msh_crmeb_22: Spring Boot 2.2 后端(C端API/管理端/业务逻辑)\n- models-integration: AI服务集成(Coze/KieAI/腾讯ASR)\n- docs: 产品文档与设计稿
This commit is contained in:
107
.cursor/plans/修复kieai回调反序列化问题_85d41db5.plan.md
Normal file
107
.cursor/plans/修复kieai回调反序列化问题_85d41db5.plan.md
Normal file
@@ -0,0 +1,107 @@
|
||||
---
|
||||
name: 修复KieAI回调反序列化问题
|
||||
overview: 修复 KieAI 回调接口的 JSON 反序列化错误,确保视频生成完成后能正确更新 article 表中的 video_url 和 status_task 字段
|
||||
todos: []
|
||||
isProject: false
|
||||
---
|
||||
|
||||
# 修复 KieAI 回调反序列化问题
|
||||
|
||||
## 问题分析
|
||||
|
||||
通过日志分析发现:
|
||||
|
||||
```
|
||||
Could not resolve parameter [0]... Problem deserializing 'setterless' property 'resultUrls':
|
||||
get method returned null
|
||||
```
|
||||
|
||||
KieAI 的回调请求已经到达后端 `/api/front/kieai/callback`,但是 Jackson 在反序列化 `KieAIQueryTaskResponse` 时失败,导致:
|
||||
|
||||
1. 回调处理方法 `handleCallback` 无法正常执行
|
||||
2. `handleTaskCallback` 中更新 article 表的逻辑从未运行
|
||||
3. 数据库中的 video_url 和 status_task 字段保持未更新状态
|
||||
|
||||
## 技术细节
|
||||
|
||||
**反序列化失败原因:**
|
||||
|
||||
- `KieAIQueryTaskResponse.TaskData` 类使用了 `@Data` 注解(Lombok)
|
||||
- `resultUrls` 字段虽然有 getter,但 Jackson 在反序列化嵌套的 List 类型时需要显式的 setter
|
||||
- 当前的便捷方法 `getResultUrls()` 定义在父类,不满足 Jackson 对 `TaskData.resultUrls` 字段的反序列化要求
|
||||
|
||||
## 修复方案
|
||||
|
||||
### 文件:`[KieAIQueryTaskResponse.java](msh_crmeb_22/crmeb-common/src/main/java/com/zbkj/common/response/kieai/KieAIQueryTaskResponse.java)`
|
||||
|
||||
**当前问题代码(第 73-113 行):**
|
||||
|
||||
```java
|
||||
@Data
|
||||
public static class TaskData implements Serializable {
|
||||
// ... other fields ...
|
||||
|
||||
@ApiModelProperty(value = "结果URL数组(视频/图片地址)")
|
||||
private java.util.List<String> resultUrls; // Lombok @Data 应该生成 setter,但可能被优化掉了
|
||||
|
||||
// ... other fields ...
|
||||
}
|
||||
```
|
||||
|
||||
**修复方法:**
|
||||
|
||||
添加显式的 setter 方法到 `TaskData` 类中:
|
||||
|
||||
```java
|
||||
@Data
|
||||
public static class TaskData implements Serializable {
|
||||
// ... existing fields ...
|
||||
|
||||
@ApiModelProperty(value = "结果URL数组(视频/图片地址)")
|
||||
private java.util.List<String> resultUrls;
|
||||
|
||||
// 显式添加 setter 方法以确保 Jackson 反序列化正常工作
|
||||
public void setResultUrls(java.util.List<String> resultUrls) {
|
||||
this.resultUrls = resultUrls;
|
||||
}
|
||||
|
||||
// ... other fields ...
|
||||
}
|
||||
```
|
||||
|
||||
**为什么这样修复:**
|
||||
|
||||
1. Lombok 的 `@Data` 注解理论上会自动生成 getter/setter,但在某些情况下(如嵌套泛型、继承关系等),Jackson 可能无法正确识别
|
||||
2. 显式声明 setter 方法可以确保 Jackson 在反序列化时能够正确填充 `resultUrls` 字段
|
||||
3. 这不会与 Lombok 冲突,显式方法优先级更高
|
||||
|
||||
## 验证方法
|
||||
|
||||
修复后,当 KieAI 发送回调时:
|
||||
|
||||
1. 查看日志,应该看到:
|
||||
```
|
||||
接收KieAI任务回调,任务ID: xxx
|
||||
处理KieAI任务回调,任务ID: xxx, 状态: success
|
||||
找到article记录,articleId: xxx, videoUrl: xxx, statusTask: 1
|
||||
更新article视频信息成功
|
||||
```
|
||||
2. 数据库验证:
|
||||
```sql
|
||||
SELECT id, task_id, video_url, status_task FROM eb_article WHERE task_id = 'xxx';
|
||||
```
|
||||
应该看到 `video_url` 被正确填充,`status_task` 为 1(成功)或 2(失败)
|
||||
3. 前端验证:
|
||||
- 访问 `http://127.0.0.1:20822/api/front/tool/community/detail/302`
|
||||
- 响应中应该包含 `videoUrl` 和 `hasVideo: true`
|
||||
|
||||
## 其他说明
|
||||
|
||||
**现有的回调处理逻辑是正确的:**
|
||||
|
||||
- `ToolKieAIServiceImpl.handleTaskCallback()` 方法(第 148-187 行)逻辑完整
|
||||
- 通过 `taskId` 查询 article 记录
|
||||
- 解析 `resultUrls` 并更新 `video_url` 和 `status_task`
|
||||
- 日志记录完善
|
||||
|
||||
问题仅在于回调数据无法被正确反序列化,导致方法未被调用。
|
||||
Reference in New Issue
Block a user