3.6 KiB
3.6 KiB
name, overview, todos, isProject
| name | overview | todos | isProject |
|---|---|---|---|
| 修复KieAI回调反序列化问题 | 修复 KieAI 回调接口的 JSON 反序列化错误,确保视频生成完成后能正确更新 article 表中的 video_url 和 status_task 字段 | false |
修复 KieAI 回调反序列化问题
问题分析
通过日志分析发现:
Could not resolve parameter [0]... Problem deserializing 'setterless' property 'resultUrls':
get method returned null
KieAI 的回调请求已经到达后端 /api/front/kieai/callback,但是 Jackson 在反序列化 KieAIQueryTaskResponse 时失败,导致:
- 回调处理方法
handleCallback无法正常执行 handleTaskCallback中更新 article 表的逻辑从未运行- 数据库中的 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 行):
@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 类中:
@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 ...
}
为什么这样修复:
- Lombok 的
@Data注解理论上会自动生成 getter/setter,但在某些情况下(如嵌套泛型、继承关系等),Jackson 可能无法正确识别 - 显式声明 setter 方法可以确保 Jackson 在反序列化时能够正确填充
resultUrls字段 - 这不会与 Lombok 冲突,显式方法优先级更高
验证方法
修复后,当 KieAI 发送回调时:
- 查看日志,应该看到:
接收KieAI任务回调,任务ID: xxx
处理KieAI任务回调,任务ID: xxx, 状态: success
找到article记录,articleId: xxx, videoUrl: xxx, statusTask: 1
更新article视频信息成功
- 数据库验证:
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 - 日志记录完善
问题仅在于回调数据无法被正确反序列化,导致方法未被调用。