alibaba/spring-ai-alibaba · warning
实验不存在: {}
Error message
实验不存在: {} What it means
ExperimentServiceImpl.getResults first verifies the experiment exists. When experimentMapper.selectById(experimentId) returns null, it logs this warning and returns null. This is a guard against querying results for a nonexistent experiment; the null return means 'no such experiment' and must be handled by the caller.
Source
Thrown at spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/service/impl/ExperimentServiceImpl.java:172
EvaluatorDO evaluatorDO = evaluatorMapper.selectById(evaluatorConfig.getEvaluatorId());
evaluatorConfig.setEvaluatorName(evaluatorDO != null ? evaluatorDO.getName() : "Unknown Evaluator");
} catch (Exception e) {
log.warn("Failed to fetch evaluator name for id: {}", evaluatorConfig.getEvaluatorId(), e);
evaluatorConfig.setEvaluatorName("Error Fetching Name");
}
});
experiment.setEvaluatorConfig(JSON.toJSONString(evaluatorConfigList));
return experiment;
}
@Override
public List<ExperimentEvaluatorResult> getResults(Long experimentId) {
log.info("查询实验结果: {}", experimentId);
// 先检查实验是否存在
ExperimentDO experiment = experimentMapper.selectById(experimentId);
if (experiment == null) {
log.warn("实验不存在: {}", experimentId);
return null;
}
Integer dataCount = datasetVersionMapper.selectById(experiment.getDatasetVersionId()).getDataCount();
// 检查dataCount是否为null或0,避免除零异常
if (dataCount == null || dataCount == 0) {
log.warn("数据集版本数据量为0或不存在: {}", experiment.getDatasetVersionId());
dataCount = 1; // 避免除零异常,设置默认值
}
// 正确解析 evaluatorConfig JSON 数组字符串为 List<EvaluatorConfig>
List<EvaluatorConfig> evaluatorConfigList = JSON.parseArray(experiment.getEvaluatorConfig(), EvaluatorConfig.class);
// 提取 evaluatorVersionId 列表
List<Long> evaluatorList = evaluatorConfigList.stream()
.map(e -> Long.valueOf(e.getEvaluatorVersionId()))
.toList();View on GitHub (pinned to f82da0b50f)
Solutions
- Verify the experimentId via list() or a direct selectById before requesting results.
- Null-check getResults' return and respond with 404 rather than assuming empty results.
- Re-run or re-create the experiment if it was deleted.
- Check that the service connects to the expected database.
Example fix
// before
List<ExperimentEvaluatorResult> results = experimentService.getResults(id);
results.size(); // NPE when experiment missing
// after
List<ExperimentEvaluatorResult> results = experimentService.getResults(id);
if (results == null) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Experiment not found: " + id);
} Defensive patterns
Strategy: type-guard
Validate before calling
public static boolean experimentExists(Long id) {
return id != null && experimentMapper.selectById(id) != null;
} Type guard
List<ExperimentEvaluatorResult> results = experimentService.getResults(experimentId);
if (results == null) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Experiment not found: " + experimentId);
} Prevention
- Never assume getResults returns a list — null means the experiment is missing.
- Validate experimentId existence before requesting results.
- Avoid holding experiment IDs past their deletion (soft-delete or cascade results).
- Add integration tests covering lookup of deleted experiments.
When it happens
Trigger: Calling experimentService.getResults(experimentId) with an experimentId that does not exist in the experiment table, or that was deleted before the call.
Common situations: Client retries with an old ID after experiment deletion; results page refreshed after cleanup; ID copy-paste from another environment; race between list and results fetch.
Understand the failure class
Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.
Related errors
- 未找到ID为{}的实验
- Dataset version not found: {}
- Invalid experiment status: {}
- Failed to fetch evaluator name for id: {}
- 实验 {} 状态为 {},无法停止
AI-assisted analysis of alibaba/spring-ai-alibaba@f82da0b50f (2026-09-09).
Data as JSON: /api/errors/77d073ada6fa2a89.
Report an issue: GitHub.