alibaba/spring-ai-alibaba · warning
获取数据集版本信息失败: experimentId={}, datasetVersionId={}
Error message
获取数据集版本信息失败: experimentId={}, datasetVersionId={} What it means
In ExperimentServiceImpl.getExperimentsByEvaluator, each experiment DO is converted to an Experiment via Experiment.fromDO, which resolves dataset version info. If that conversion throws, this warning is logged with the experiment ID and datasetVersionId, and the code falls back to calling Experiment.fromDO again — meaning the same exception will likely be rethrown, failing the whole listing call.
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:644
// 计算偏移量
long offset = (request.getPageNumber() - 1L) * request.getPageSize();
List<ExperimentDO> experimentDOList;
int totalCount;
experimentDOList = experimentMapper.selectByEvaluatorId(
request.getEvaluatorId(), offset, request.getPageSize());
totalCount = experimentMapper.selectCountByEvaluatorId(request.getEvaluatorId());
// 转换为DTO并获取数据集版本信息
List<Experiment> experiments = experimentDOList.stream()
.map(experimentDO -> {
try {
return Experiment.fromDO(experimentDO);
} catch (Exception e) {
log.warn("获取数据集版本信息失败: experimentId={}, datasetVersionId={}",
experimentDO.getId(), experimentDO.getDatasetVersionId(), e);
return Experiment.fromDO(experimentDO);
}
})
.toList();
return new PageResult<>(
(long) totalCount,
(long) request.getPageNumber(),
(long) request.getPageSize(),
experiments
);
} catch (Exception e) {
log.error("查询评估器关联的实验失败: {}", request, e);
throw new RuntimeException("查询评估器关联的实验失败: " + e.getMessage());
}
}View on GitHub (pinned to f82da0b50f)
Solutions
- Check every experiment's datasetVersionId referenced by the evaluator — restore the missing dataset_version rows or fix the references.
- Inspect the logged stack trace to see exactly which field in Experiment.fromDO throws; repair that column's data.
- Make Experiment.fromDO tolerant of missing dataset versions (return partial DTO) instead of throwing.
- Add a DB foreign key or consistency check so experiments cannot reference nonexistent dataset versions.
Example fix
// before
} catch (Exception e) {
log.warn("获取数据集版本信息失败: experimentId={}, datasetVersionId={}",
experimentDO.getId(), experimentDO.getDatasetVersionId(), e);
return Experiment.fromDO(experimentDO); // same failure rethrown
}
// after
} catch (Exception e) {
log.warn("获取数据集版本信息失败: experimentId={}, datasetVersionId={}",
experimentDO.getId(), experimentDO.getDatasetVersionId(), e);
return Experiment.fromDOWithoutDatasetVersion(experimentDO); // degraded but non-throwing fallback
} Defensive patterns
Strategy: fallback
Validate before calling
experimentDOList.forEach(e -> {
if (e.getDatasetVersionId() == null || datasetVersionMapper.selectById(e.getDatasetVersionId()) == null) {
log.warn("Experiment {} references missing dataset version {}", e.getId(), e.getDatasetVersionId());
}
}); Try / catch
try {
return experimentService.getExperimentsByEvaluator(evaluatorId);
} catch (Exception e) {
// fromDO rethrows after the warn; degrade to listing without dataset info
log.error("Listing experiments for evaluator {} failed", evaluatorId, e);
throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR,
"Experiments reference missing dataset versions; repair data", e);
} Prevention
- Audit experiments whose datasetVersionId has no matching dataset_version row and repair or null them out.
- Add a foreign key or scheduled consistency check between experiment and dataset_version.
- Make Experiment.fromDO degrade gracefully (omit dataset info) instead of throwing on missing versions.
- Backfill datasetVersionId for legacy rows created before the field existed.
When it happens
Trigger: Listing experiments for an evaluator when an experiment's datasetVersionId references a missing/deleted dataset version, or its evaluatorConfig/data fields are corrupt so Experiment.fromDO throws during dataset version resolution.
Common situations: Dataset version deleted while experiments still reference it (no FK enforcement); legacy rows with null datasetVersionId from an older schema; partially migrated data after an upgrade; JSON fields in a legacy format.
Understand the failure class
Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.
Related errors
AI-assisted analysis of alibaba/spring-ai-alibaba@f82da0b50f (2026-09-09).
Data as JSON: /api/errors/f871ce7b1af7c418.
Report an issue: GitHub.