alibaba/spring-ai-alibaba · error · IllegalStateException

Cannot delete published version:

Error message

Cannot delete published version: 

What it means

deleteById() refuses to delete versions whose status is PUBLISHED, throwing IllegalStateException("Cannot delete published version: " + id). This is a business-rule protection: published versions are considered immutable reference data and must be unpublished or archived through another workflow first.

Solutions

  1. Change the version status away from PUBLISHED (e.g. via update with status ARCHIVED/DRAFT) before deleting.
  2. Filter the deletion set to exclude versions with status PUBLISHED.
  3. If policy allows, unpublish the version through the intended workflow, then retry the delete.

Example fix

// before
service.deleteById(publishedId); // IllegalStateException
// after
DatasetVersion v = service.getById(publishedId);
if ("PUBLISHED".equals(v.getStatus())) {
    service.update(new DatasetVersionUpdateRequest(publishedId, null, "ARCHIVED"));
}
service.deleteById(publishedId);
Defensive patterns

Strategy: validation

Validate before calling

DatasetVersion v = service.getById(id);
if (v != null && "PUBLISHED".equals(v.getStatus())) {
    throw new IllegalStateException("unpublish or archive version " + id + " before deleting");
}

Type guard

boolean isPublished(DatasetVersion v) { return v != null && "PUBLISHED".equals(v.getStatus()); }

Try / catch

try {
    service.deleteById(id);
} catch (IllegalStateException e) {
    // surface 'unpublish first' guidance to the user
    return ResponseEntity.status(HttpStatus.CONFLICT).body(Map.of("error", e.getMessage()));
}

Prevention

When it happens

Trigger: Calling deleteById on a version row whose status column equals "PUBLISHED"; attempting bulk cleanup that includes published versions.

Common situations: Cleaning up old dataset versions after an evaluation cycle and hitting published baselines; scripts that iterate all versions without filtering status; API users unaware of the publication lifecycle.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


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

Appendix: source

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

    /**
     * Delete dataset version by ID
     */
    @Transactional
    public void deleteById(Long id) {
        log.info("Deleting dataset version: {}", id);
        
        if (id == null) {
            throw new IllegalArgumentException("Version ID cannot be null");
        }

        DatasetVersionDO existingVersion = datasetVersionMapper.selectById(id);
        if (existingVersion == null) {
            throw new IllegalArgumentException("Dataset version not found: " + id);
        }

        if ("PUBLISHED".equals(existingVersion.getStatus())) {
            throw new IllegalStateException("Cannot delete published version: " + id);
        }

        int result = datasetVersionMapper.deleteById(id);
        if (result <= 0) {
            throw new RuntimeException("Failed to delete dataset version");
        }

        log.info("Dataset version deleted successfully: {}", id);
    }

    @Override
    public PageResult<Experiment> getExperiments(DatasetExperimentsListRequest request) {
        long offset = (request.getPageNumber() - 1L) * request.getPageSize();

        List<ExperimentDO> experimentDOList = experimentMapper.selectByDatasetId(request.getDatasetId(), offset, request.getPageSize());

        Integer totalCount = experimentMapper.selectCountByDatasetId(request.getDatasetId());

View on GitHub (pinned to f82da0b50f)