{"record":{"id":"c1d1517929494656","repo":"alibaba/spring-ai-alibaba","slug":"failed-to-fetch-evaluator-name-for-id","errorCode":null,"errorMessage":"Failed to fetch evaluator name for id: {}","messagePattern":"Failed to fetch evaluator name for id: (.+?)","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":157,"sourceCode":"        \n        ExperimentDO experimentDO = experimentMapper.selectById(id);\n        if (experimentDO == null) {\n            log.warn(\"未找到ID为{}的实验\", id);\n            return null;\n        }\n\n        Experiment experiment = Experiment.fromDO(experimentDO);\n\n        List<EvaluatorConfig> evaluatorConfigList = JSON.parseArray(experiment.getEvaluatorConfig(), EvaluatorConfig.class);\n\n        evaluatorConfigList.stream()\n                .filter(Objects::nonNull)\n                .forEach(evaluatorConfig -> {\n                    try {\n                        EvaluatorDO evaluatorDO = evaluatorMapper.selectById(evaluatorConfig.getEvaluatorId());\n                        evaluatorConfig.setEvaluatorName(evaluatorDO != null ? evaluatorDO.getName() : \"Unknown Evaluator\");\n                    } catch (Exception e) {\n                        log.warn(\"Failed to fetch evaluator name for id: {}\", evaluatorConfig.getEvaluatorId(), e);\n                        evaluatorConfig.setEvaluatorName(\"Error Fetching Name\");\n                    }\n                });\n        experiment.setEvaluatorConfig(JSON.toJSONString(evaluatorConfigList));\n        return experiment;\n    }\n\n    @Override\n    public List<ExperimentEvaluatorResult> getResults(Long experimentId) {\n        log.info(\"查询实验结果: {}\", experimentId);\n        \n        // 先检查实验是否存在\n        ExperimentDO experiment = experimentMapper.selectById(experimentId);\n        if (experiment == null) {\n            log.warn(\"实验不存在: {}\", experimentId);\n            return null;\n        }\n","sourceCodeStart":139,"sourceCodeEnd":175,"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#L139-L175","documentation":"Inside ExperimentServiceImpl.getById, each evaluator config's name is enriched via evaluatorMapper.selectById. If that lookup throws (e.g., DB error, connection issue), the code logs this warning with the evaluator ID and the exception, then sets the config's evaluatorName to \"Error Fetching Name\" and continues. The request still succeeds but the returned evaluator config has a placeholder name.","triggerScenarios":"A database exception occurs during evaluatorMapper.selectById(evaluatorConfig.getEvaluatorId()) while loading an experiment whose evaluatorConfig JSON references evaluators — e.g., connection timeout, table lock, or schema mismatch.","commonSituations":"Transient DB connectivity loss under load; an evaluator was deleted so enrichment behaves differently; malformed evaluatorConfig JSON causing a bad evaluatorId; datasource failover mid-request.","solutions":["Inspect the full logged stack trace (the trailing exception 'e') for the underlying DB error and fix that root cause.","Check database connectivity/pool health (e.g., Druid/HikariCP logs, max connections).","Validate evaluator IDs stored in experiment.evaluatorConfig; clean up references to deleted evaluators.","Optionally resolve names in batch before the loop so a single failure doesn't produce placeholder names."],"exampleFix":"// before\nevaluatorConfig.setEvaluatorName(\"Error Fetching Name\"); // silently continues\n\n// after\ntry {\n    EvaluatorDO evaluatorDO = evaluatorMapper.selectById(cfg.getEvaluatorId());\n    cfg.setEvaluatorName(evaluatorDO != null ? evaluatorDO.getName() : \"Unknown Evaluator\");\n} catch (Exception e) {\n    log.error(\"Failed to fetch evaluator name for id: {}\", cfg.getEvaluatorId(), e);\n    cfg.setEvaluatorName(\"Unknown Evaluator\"); // and monitor via error-level log/metric\n}","handlingStrategy":"try-catch","validationCode":"// Pre-check evaluator references before loading an experiment\nList<Long> ids = configs.stream()\n    .map(EvaluatorConfig::getEvaluatorId)\n    .filter(Objects::nonNull)\n    .toList();\nids.forEach(id -> { if (evaluatorMapper.selectById(id) == null) log.warn(\"Evaluator {} missing\", id); });","typeGuard":null,"tryCatchPattern":"try {\n    Experiment exp = experimentService.getById(id);\n    exp.getEvaluatorConfigList().stream()\n        .filter(c -> \"Error Fetching Name\".equals(c.getEvaluatorName()))\n        .forEach(c -> log.warn(\"Degraded evaluator name for id: {}\", c.getEvaluatorId()));\n} catch (Exception e) {\n    // inspect logged cause: usually a DB connectivity/schema error\n    throw new IllegalStateException(\"Failed to load experiment with evaluator enrichment\", e);\n}","preventionTips":["Read the chained exception in the warn log for the true DB root cause.","Monitor 'Error Fetching Name' placeholders as a data-health signal.","Clean evaluatorConfig references when deleting evaluators (soft-delete preferred).","Batch-resolve evaluator names in one query to reduce per-row DB failures."],"tags":["java","spring","mybatis","database","evaluator"],"backgroundTag":"database-query-failed","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"}