alibaba/spring-ai-alibaba · warning · IllegalArgumentException

Invalid page number or page size

Error message

Invalid page number or page size

What it means

Thrown by ExperimentServiceImpl.getResult after computing offset = (pageNumber-1)*pageSize: if offset < 0 or pageSize <= 0 the paging parameters are invalid. This guards the SQL LIMIT/OFFSET query from nonsensical values.

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:237

    public PageResult<ExperimentEvaluatorResultDetail> getResult(ExperimentEvaluatorResultDetailListRequest request){

        // 先检查实验是否存在
        ExperimentDO experiment = experimentMapper.selectById(request.getExperimentId());
        if (experiment == null) {
            log.warn("实验不存在: {}", request.getExperimentId());
            return null;
        }
        if (request.getEvaluatorVersionId() == null) {
            throw new IllegalArgumentException("Evaluator version ID cannot be null");
        }


        Integer offset = (request.getPageNumber() - 1) * request.getPageSize();

        Integer limit = request.getPageSize();

        if (offset < 0 || limit <= 0) {
            throw new IllegalArgumentException("Invalid page number or page size");
        }


        Integer totalCount = experimentResultMapper.selectCountByExperimentIdAndEvaluator(request.getExperimentId(), request.getEvaluatorVersionId());

        List<ExperimentResultDO> resultList = experimentResultMapper.selectByExperimentAndEvaluatorWithPageble(request.getExperimentId(),request.getEvaluatorVersionId(),offset,request.getPageSize());


        List<ExperimentEvaluatorResultDetail> resultItems = resultList.stream()
                .map(ExperimentEvaluatorResultDetail::fromDO)
                .toList();

        return new PageResult<>(
                (long) totalCount,
                (long) request.getPageNumber(),
                (long) request.getPageSize(),
                resultItems);

View on GitHub (pinned to f82da0b50f)

Solutions

  1. Clamp pageNumber to a minimum of 1 and pageSize to a positive value (e.g. 1..100) on the client
  2. Default uninitialized pageNumber/pageSize to 1 and a sane page size before sending
  3. Validate the request DTO with @Min(1) constraints so Spring returns 400 early

Example fix

// before
Integer offset = (request.getPageNumber() - 1) * request.getPageSize();
// after
int pageNumber = Math.max(1, request.getPageNumber());
int pageSize = Math.max(1, request.getPageSize());
int offset = (pageNumber - 1) * pageSize;
Defensive patterns

Strategy: validation

Validate before calling

int page = Math.max(1, request.getPageNumber());
int size = Math.max(1, Math.min(request.getPageSize(), 100));

Type guard

boolean validPaging(Integer pageNumber, Integer pageSize) { return pageNumber != null && pageSize != null && pageNumber >= 1 && pageSize > 0; }

Try / catch

try { return experimentService.getResult(request); } catch (IllegalArgumentException e) { return fallbackFirstPage(); }

Prevention

When it happens

Trigger: pageNumber = 0 or negative (offset becomes negative), or pageSize = 0 / negative passed in the request.

Common situations: Client initializing pageNumber to 0 instead of 1; a computed pageSize that becomes 0 after an empty filter; integer parsing of an empty string yielding 0; frontend pagination bug sending page=-1 on refresh.

Understand the failure class

Background: "value must be between 0 and 1" / "out of range" / "must not be negative" errors: fixing range-validation failures across open-source libraries — this error's family across 42 libraries.

Related errors


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