alibaba/spring-ai-alibaba · error · RuntimeException

创建评估器版本失败

Error message

创建评估器版本失败

What it means

Thrown by EvaluatorVersionServiceImpl.create when evaluatorVersionMapper.insert returns 0, meaning the new evaluator version row was not persisted. MyBatis insert returning 0 usually indicates a constraint violation surfaced as a no-op or a DB-level failure swallowed by the mapper.

Source

Thrown at spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/service/impl/EvaluatorVersionServiceImpl.java:49

        // 构建DO对象
        EvaluatorVersionDO evaluatorVersionDO = EvaluatorVersionDO.builder()
                .evaluatorId(Long.valueOf(request.getEvaluatorId()))
                .description(request.getDescription())
                .version(request.getVersion())
                .modelConfig(request.getModelConfig())
                .prompt(request.getPrompt())
                .variables(request.getVariables())
                .createTime(LocalDateTime.now())
                .updateTime(LocalDateTime.now())
                .build();

        // 插入数据库
        int result = evaluatorVersionMapper.insert(evaluatorVersionDO);
        if (result > 0) {
            log.info("评估器版本创建成功: {}", evaluatorVersionDO.getId());
            return EvaluatorVersion.fromDO(evaluatorVersionDO);
        } else {
            throw new RuntimeException("创建评估器版本失败");
        }
    }

    @Override
    public PageResult<EvaluatorVersion> list(EvaluatorVersionListRequest request) {
        log.info("查询评估器版本列表: {}", request);

        // 计算分页参数
        int pageNumber = request.getPageNumber() != null ? request.getPageNumber() : 1;
        int pageSize = request.getPageSize() != null ? request.getPageSize() : 10;
        long offset = (pageNumber - 1L) * pageSize;

        // 查询数据
        List<EvaluatorVersionDO> evaluatorVersionDOList = evaluatorVersionMapper.selectListByEvaluatorId(
                request.getEvaluatorId(), request.getName(), offset, pageSize);
        int total = evaluatorVersionMapper.countByEvaluatorId(request.getEvaluatorId(), null);

        // 封装分页结果

View on GitHub (pinned to f82da0b50f)

Solutions

  1. Check DB constraints and migrations for evaluator_version table; fix duplicate/foreign-key data
  2. Throw a typed DuplicateVersionException on 0-rows so clients see 409 instead of generic 500
  3. Verify the evaluator referenced by the request still exists before inserting
  4. Inspect server logs / SQL exceptions emitted around the insert for the root cause

Example fix

// before
int result = evaluatorVersionMapper.insert(evaluatorVersionDO);
if (result > 0) { ... } else {
    throw new RuntimeException("创建评估器版本失败");
}
// after
if (evaluatorMapper.selectById(request.getEvaluatorId()) == null) {
    throw new EvaluatorNotFoundException(request.getEvaluatorId());
}
int result = evaluatorVersionMapper.insert(evaluatorVersionDO);
if (result <= 0) {
    throw new EvaluatorVersionCreateException("Duplicate or invalid evaluator version: " + request.getVersion());
}
Defensive patterns

Strategy: validation

Validate before calling

if (evaluatorMapper.selectById(request.getEvaluatorId()) == null) throw new EvaluatorNotFoundException(request.getEvaluatorId());
if (evaluatorVersionMapper.selectByVersion(request.getEvaluatorId(), request.getVersion()) != null) throw new DuplicateVersionException();

Type guard

boolean canCreateVersion(EvaluatorVersionCreateRequest r) { return r != null && r.getEvaluatorId() != null && evaluatorMapper.selectById(r.getEvaluatorId()) != null; }

Try / catch

try { return evaluatorVersionService.create(request); } catch (RuntimeException e) { log.error("version create failed", e); throw new ResponseStatusException(HttpStatus.CONFLICT, e.getMessage()); }

Prevention

When it happens

Trigger: Inserting an evaluator version whose evaluator_id violates a foreign key, a duplicate version number under a unique constraint, or a schema mismatch causing the affected-row count to be 0.

Common situations: Creating a version for an evaluator that was deleted concurrently; unique key on (evaluator_id, version) colliding; running against a DB whose schema is behind migrations.

Related errors


AI-assisted analysis of alibaba/spring-ai-alibaba@f82da0b50f (2026-09-09). Data as JSON: /api/errors/af741701249b93d0. Report an issue: GitHub.