--- name: "" overview: "" todos: [] isProject: false --- # 诊断article.status_task异常和video_url未更新问题 ## 问题描述 **问题1**:提交饮食打卡记录时,article表中的status_task字段保持为0或变成2,而不是预期的1(完成) **问题2**:article表中的video_url字段始终为NULL,即使视频已经生成完成 **关键信息**: - KieAI回调一般需要10秒以上才到达,不会立即回调 - 两个问题有关联,都指向**KieAI回调没有正常执行或执行失败** ## 根因分析 ### 核心问题:KieAI回调未正常执行 根据分析,最可能的原因是: **原因1:回调反序列化失败**(最可能) 根据[修复kieai回调反序列化问题计划](修复kieai回调反序列化问题_85d41db5.plan.md),KieAI回调到达后端,但Jackson反序列化失败: ``` Could not resolve parameter [0]... Problem deserializing 'setterless' property 'resultUrls': get method returned null ``` 这导致: 1. `handleCallback` 方法无法执行 2. `handleTaskCallback` 中更新article的逻辑从未运行 3. `video_url` 和 `status_task` 字段保持未更新状态 **原因2:回调URL配置错误** - `kieAIConfig.getApiCallbackUrl()` 可能未配置或配置错误 - KieAI服务无法访问回调地址(网络问题、防火墙等) - 回调地址格式不正确 **原因3:回调数据格式问题** - KieAI返回的数据结构与`KieAIQueryTaskResponse`不匹配 - `resultUrls`字段名称或格式异常 ## 执行流程分析 ### 预期流程(正常情况) ```mermaid sequenceDiagram participant Frontend as 前端 participant Sora2 as ToolSora2ServiceImpl participant KieAI as KieAI服务 participant Callback as KieAIController participant Service as ToolKieAIServiceImpl participant DB as 数据库 Frontend->>Sora2: createImageToVideoTask Sora2->>KieAI: POST createTask含callBackUrl KieAI-->>Sora2: 返回taskId Sora2->>DB: INSERT article status_task=0 Note over DB: status_task = 0 Note over KieAI: 10秒以上视频生成中 KieAI->>Callback: POST callback含resultUrls Callback->>Callback: 反序列化KieAIQueryTaskResponse Callback->>Service: handleTaskCallback Service->>DB: SELECT article WHERE task_id Service->>Service: extractVideoUrl Service->>DB: UPDATE video_url status_task=1 Note over DB: video_url有值 status_task=1 ``` ### 实际流程(异常情况) ```mermaid sequenceDiagram participant Frontend as 前端 participant Sora2 as ToolSora2ServiceImpl participant KieAI as KieAI服务 participant Callback as KieAIController participant DB as 数据库 Frontend->>Sora2: createImageToVideoTask Sora2->>KieAI: POST createTask KieAI-->>Sora2: 返回taskId Sora2->>DB: INSERT article status_task=0 Note over DB: status_task = 0 Note over KieAI: 10秒以上... KieAI->>Callback: POST callback Callback--xCallback: 反序列化失败 Note over Callback: Jackson报错setterless property resultUrls Note over DB: video_url仍为NULL status_task仍为0 Note over Frontend,DB: 回调处理逻辑从未执行数据库未更新 ``` ## 解决方案 ### 方案1:修复回调反序列化问题(主要修复) **文件**:[KieAIQueryTaskResponse.java](msh_crmeb_22/crmeb-common/src/main/java/com/zbkj/common/response/kieai/KieAIQueryTaskResponse.java) **问题代码**(TaskData类): ```java @Data public static class TaskData implements Serializable { @ApiModelProperty(value = "结果URL数组(视频/图片地址)") private java.util.List resultUrls; // Lombok生成的setter可能被Jackson忽略 } ``` **修复方法**:显式添加setter方法 ```java @Data public static class TaskData implements Serializable { @ApiModelProperty(value = "结果URL数组(视频/图片地址)") private java.util.List resultUrls; // 显式添加setter以确保Jackson反序列化正常 public void setResultUrls(java.util.List resultUrls) { this.resultUrls = resultUrls; } } ``` ### 方案2:验证回调URL配置 **检查配置文件**(application.yml或application.properties): ```yaml kie-ai: api-callback-url: http://your-domain.com/api/front/kieai/callback ``` **验证要点**: 1. URL必须是KieAI服务可访问的公网地址 2. 确保没有防火墙阻止 3. 路径正确:`/api/front/kieai/callback` ### 方案3:添加详细日志(辅助调试) 在[KieAIController.java](msh_crmeb_22/crmeb-front/src/main/java/com/zbkj/front/controller/KieAIController.java)的回调方法开头添加: ```java @PostMapping("/callback") public KieAINanoBananaResponse handleCallback( @RequestBody KieAIQueryTaskResponse callbackData) { try { logger.info("======== KieAI回调原始数据 ========"); logger.info("完整对象: {}", JSON.toJSONString(callbackData)); logger.info("taskId: {}", callbackData.getTaskId()); logger.info("state: {}", callbackData.getState()); logger.info("resultUrls: {}", callbackData.getResultUrls()); String taskId = callbackData.getTaskId(); logger.info("接收KieAI任务回调,任务ID: {}", taskId); toolKieAIService.handleTaskCallback(taskId, callbackData); return KieAINanoBananaResponse.success("回调处理成功"); } catch (Exception e) { logger.error("处理任务回调失败", e); return KieAINanoBananaResponse.fail("回调处理失败"); } } ``` ## 诊断和修复步骤 ### 步骤1:修复反序列化问题(优先级最高) 1. 修改`KieAIQueryTaskResponse.java`中的`TaskData`类,显式添加setter 2. 重启后端服务 3. 提交一次打卡测试 ### 步骤2:检查后端日志 **如果回调仍未执行**,检查日志: 1. 搜索:`接收KieAI任务回调` - 找到:回调到达了,检查反序列化错误 - 没找到:回调未到达,检查回调URL配置 2. 搜索:`deserializing` 或 `Jackson` 或 `Could not resolve` - 找到:确认是反序列化问题 3. 查看article创建日志: ``` 文章新增成功, taskId: xxx ``` ### 步骤3:验证回调URL配置 1. 检查`application.yml`中的`kie-ai.api-callback-url` 2. 确认URL可从外网访问 3. 测试回调接口是否正常响应 ### 步骤4:验证修复效果 提交打卡后,检查数据库: ```sql SELECT id, task_id, video_url, status_task, create_time, update_time FROM eb_article WHERE task_id = 'your_task_id' ORDER BY create_time DESC LIMIT 1; ``` **预期结果**: - `status_task = 1`(任务完成) - `video_url` 有值 - `update_time` 在create_time的10秒以上后更新 ## 问题总结 ### 核心原因 KieAI回调无法被正确处理,导致: 1. `video_url`未更新(始终为NULL) 2. `status_task`未更新(保持为0) ### 最可能的原因 根据[修复kieai回调反序列化问题计划](修复kieai回调反序列化问题_85d41db5.plan.md),Jackson反序列化失败导致回调处理方法无法执行。 ### 修复优先级 1. **优先级1**:修复`KieAIQueryTaskResponse.TaskData`反序列化(添加显式setter) 2. **优先级2**:验证回调URL配置 3. **优先级3**:添加详细日志 ## 涉及文件 - [KieAIQueryTaskResponse.java](msh_crmeb_22/crmeb-common/src/main/java/com/zbkj/common/response/kieai/KieAIQueryTaskResponse.java) - 主要修复 - [KieAIController.java](msh_crmeb_22/crmeb-front/src/main/java/com/zbkj/front/controller/KieAIController.java) - 回调入口 - [ToolKieAIServiceImpl.java](msh_crmeb_22/crmeb-service/src/main/java/com/zbkj/service/service/impl/tool/ToolKieAIServiceImpl.java) - 回调处理 - [ToolSora2ServiceImpl.java](msh_crmeb_22/crmeb-service/src/main/java/com/zbkj/service/service/impl/tool/ToolSora2ServiceImpl.java) - article创建