Files
msh-system/.cursor/plans/修复kieai回调反序列化问题_85d41db5.plan.md

107 lines
3.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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`
- 日志记录完善
问题仅在于回调数据无法被正确反序列化,导致方法未被调用。