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

3.6 KiB
Raw Permalink Blame History

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 时失败,导致:

  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 行):

@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 ...
}

为什么这样修复:

  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视频信息成功
  1. 数据库验证:
 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
  • 响应中应该包含 videoUrlhasVideo: true

其他说明

现有的回调处理逻辑是正确的:

  • ToolKieAIServiceImpl.handleTaskCallback() 方法(第 148-187 行)逻辑完整
  • 通过 taskId 查询 article 记录
  • 解析 resultUrls 并更新 video_urlstatus_task
  • 日志记录完善

问题仅在于回调数据无法被正确反序列化,导致方法未被调用。