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

  1. Check every experiment's datasetVersionId referenced by the evaluator — restore the missing dataset_version rows or fix the references.
  2. Inspect the logged stack trace to see exactly which field in Experiment.fromDO throws; repair that column's data.
  3. Make Experiment.fromDO tolerant of missing dataset versions (return partial DTO) instead of throwing.
  4. 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

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.