7.8 KiB
7.8 KiB
name, overview, todos, isProject
| 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回调到达后端,但Jackson反序列化失败:
Could not resolve parameter [0]... Problem deserializing 'setterless' property 'resultUrls':
get method returned null
这导致:
handleCallback方法无法执行handleTaskCallback中更新article的逻辑从未运行video_url和status_task字段保持未更新状态
原因2:回调URL配置错误
kieAIConfig.getApiCallbackUrl()可能未配置或配置错误- KieAI服务无法访问回调地址(网络问题、防火墙等)
- 回调地址格式不正确
原因3:回调数据格式问题
- KieAI返回的数据结构与
KieAIQueryTaskResponse不匹配 resultUrls字段名称或格式异常
执行流程分析
预期流程(正常情况)
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
实际流程(异常情况)
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
问题代码(TaskData类):
@Data
public static class TaskData implements Serializable {
@ApiModelProperty(value = "结果URL数组(视频/图片地址)")
private java.util.List<String> resultUrls; // Lombok生成的setter可能被Jackson忽略
}
修复方法:显式添加setter方法
@Data
public static class TaskData implements Serializable {
@ApiModelProperty(value = "结果URL数组(视频/图片地址)")
private java.util.List<String> resultUrls;
// 显式添加setter以确保Jackson反序列化正常
public void setResultUrls(java.util.List<String> resultUrls) {
this.resultUrls = resultUrls;
}
}
方案2:验证回调URL配置
检查配置文件(application.yml或application.properties):
kie-ai:
api-callback-url: http://your-domain.com/api/front/kieai/callback
验证要点:
- URL必须是KieAI服务可访问的公网地址
- 确保没有防火墙阻止
- 路径正确:
/api/front/kieai/callback
方案3:添加详细日志(辅助调试)
在KieAIController.java的回调方法开头添加:
@PostMapping("/callback")
public KieAINanoBananaResponse<String> 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:修复反序列化问题(优先级最高)
- 修改
KieAIQueryTaskResponse.java中的TaskData类,显式添加setter - 重启后端服务
- 提交一次打卡测试
步骤2:检查后端日志
如果回调仍未执行,检查日志:
- 搜索:
接收KieAI任务回调
- 找到:回调到达了,检查反序列化错误
- 没找到:回调未到达,检查回调URL配置
- 搜索:
deserializing或Jackson或Could not resolve
- 找到:确认是反序列化问题
- 查看article创建日志:
文章新增成功, taskId: xxx
步骤3:验证回调URL配置
- 检查
application.yml中的kie-ai.api-callback-url - 确认URL可从外网访问
- 测试回调接口是否正常响应
步骤4:验证修复效果
提交打卡后,检查数据库:
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回调无法被正确处理,导致:
video_url未更新(始终为NULL)status_task未更新(保持为0)
最可能的原因
根据修复kieai回调反序列化问题计划,Jackson反序列化失败导致回调处理方法无法执行。
修复优先级
- 优先级1:修复
KieAIQueryTaskResponse.TaskData反序列化(添加显式setter) - 优先级2:验证回调URL配置
- 优先级3:添加详细日志
涉及文件
- KieAIQueryTaskResponse.java - 主要修复
- KieAIController.java - 回调入口
- ToolKieAIServiceImpl.java - 回调处理
- ToolSora2ServiceImpl.java - article创建