{"record":{"id":"f871ce7b1af7c418","repo":"alibaba/spring-ai-alibaba","slug":"experimentid-datasetversionid","errorCode":null,"errorMessage":"获取数据集版本信息失败: experimentId={}, datasetVersionId={}","messagePattern":"获取数据集版本信息失败: experimentId=(.+?), datasetVersionId=(.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/service/impl/ExperimentServiceImpl.java","lineNumber":644,"sourceCode":"            // 计算偏移量\n            long offset = (request.getPageNumber() - 1L) * request.getPageSize();\n            \n            List<ExperimentDO> experimentDOList;\n            int totalCount;\n\n            experimentDOList = experimentMapper.selectByEvaluatorId(\n                    request.getEvaluatorId(), offset, request.getPageSize());\n\n            totalCount = experimentMapper.selectCountByEvaluatorId(request.getEvaluatorId());\n\n            \n            // 转换为DTO并获取数据集版本信息\n            List<Experiment> experiments = experimentDOList.stream()\n                    .map(experimentDO -> {\n                        try {\n                            return Experiment.fromDO(experimentDO);\n                        } catch (Exception e) {\n                            log.warn(\"获取数据集版本信息失败: experimentId={}, datasetVersionId={}\", \n                                experimentDO.getId(), experimentDO.getDatasetVersionId(), e);\n                            return Experiment.fromDO(experimentDO);\n                        }\n                    })\n                    .toList();\n            \n            return new PageResult<>(\n                    (long) totalCount,\n                    (long) request.getPageNumber(),\n                    (long) request.getPageSize(),\n                    experiments\n            );\n            \n        } catch (Exception e) {\n            log.error(\"查询评估器关联的实验失败: {}\", request, e);\n            throw new RuntimeException(\"查询评估器关联的实验失败: \" + e.getMessage());\n        }\n    }","sourceCodeStart":626,"sourceCodeEnd":662,"githubUrl":"https://github.com/alibaba/spring-ai-alibaba/blob/f82da0b50f35744c13968191be2b1cd2452ef550/spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/service/impl/ExperimentServiceImpl.java#L626-L662","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\n} catch (Exception e) {\n    log.warn(\"获取数据集版本信息失败: experimentId={}, datasetVersionId={}\",\n        experimentDO.getId(), experimentDO.getDatasetVersionId(), e);\n    return Experiment.fromDO(experimentDO); // same failure rethrown\n}\n\n// after\n} catch (Exception e) {\n    log.warn(\"获取数据集版本信息失败: experimentId={}, datasetVersionId={}\",\n        experimentDO.getId(), experimentDO.getDatasetVersionId(), e);\n    return Experiment.fromDOWithoutDatasetVersion(experimentDO); // degraded but non-throwing fallback\n}","handlingStrategy":"fallback","validationCode":"experimentDOList.forEach(e -> {\n    if (e.getDatasetVersionId() == null || datasetVersionMapper.selectById(e.getDatasetVersionId()) == null) {\n        log.warn(\"Experiment {} references missing dataset version {}\", e.getId(), e.getDatasetVersionId());\n    }\n});","typeGuard":null,"tryCatchPattern":"try {\n    return experimentService.getExperimentsByEvaluator(evaluatorId);\n} catch (Exception e) {\n    // fromDO rethrows after the warn; degrade to listing without dataset info\n    log.error(\"Listing experiments for evaluator {} failed\", evaluatorId, e);\n    throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR,\n        \"Experiments reference missing dataset versions; repair data\", e);\n}","preventionTips":["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."],"tags":["java","spring","referential-integrity","experiment","dataset"],"backgroundTag":"entity-not-found","analyzedSha":"f82da0b50f35744c13968191be2b1cd2452ef550","analyzedAt":"2026-09-09T15:32:42.421Z","contentChangedAt":"2026-09-09T15:32:42.421Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}