{"record":{"id":"32a1fe7dac32eef6","repo":"apache/seatunnel","slug":"page-number-must-be-greater-than-0","errorCode":null,"errorMessage":"Page number must be greater than 0","messagePattern":"Page number must be greater than 0","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/rest/servlet/PageBaseServlet.java","lineNumber":56,"sourceCode":"    protected void writeJsonWithPagination(\n            HttpServletRequest req, HttpServletResponse resp, JsonArray jsonArray)\n            throws IOException {\n        int total = jsonArray.size();\n\n        // fetch pagination params, if page exist, then paginate data，pagination data format like:\n        // {\"data\": [], \"total\": 10}\n        Map<String, String> parameterMap = getParameterMap(req);\n        if (parameterMap != null && parameterMap.containsKey(pageParam)) {\n            int page = Integer.parseInt(parameterMap.get(pageParam));\n            int rows =\n                    parameterMap.get(rowsParam) != null\n                            ? Integer.parseInt(parameterMap.get(rowsParam))\n                            : 10;\n            int start = (page - 1) * rows;\n            if (start > total || page < 1) {\n                throw new IllegalArgumentException(\n                        page < 1\n                                ? \"Page number must be greater than 0\"\n                                : \"Page number exceeds total pages\");\n            }\n            JsonArray paginatedArray = new JsonArray();\n            jsonArray\n                    .values()\n                    .subList(start, Math.min(start + rows, total))\n                    .forEach(\n                            t -> {\n                                paginatedArray.add(t);\n                            });\n            JsonObject paginatedObj = new JsonObject();\n            paginatedObj.add(\"data\", paginatedArray);\n            paginatedObj.add(\"total\", total);\n            writeJson(resp, paginatedObj);\n        } else {\n            writeJson(resp, jsonArray);\n        }\n    }","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/rest/servlet/PageBaseServlet.java#L38-L74","documentation":"PageBaseServlet.writeJsonWithPagination paginates a JSON array using the 'page' (or rows) query parameters. It computes start=(page-1)*rows and rejects page < 1 with 'Page number must be greater than 0'. Pagination is 1-based; page 0 or negative is invalid.","triggerScenarios":"GET a paginated REST endpoint (e.g. checkpoint history / finished-jobs) with page=0, page=-1, or a non-positive numeric page parameter.","commonSituations":"Clients using 0-based page indexes against a 1-based API; UI pagination controls starting at 0; scripting loops that run one extra iteration with page=0; copy-paste of page=0 from logs.","solutions":["Send page >= 1, e.g. ?page=1&rows=10","Fix client pagination math to start from 1","Clamp/validate the page parameter in the client before the request","Return 400 (not 500) with a message clarifying 1-based pagination"],"exampleFix":"// before\nfetch(`/finished-jobs?page=0&rows=10`);\n// after\nconst page = Math.max(1, Number(rawPage) || 1);\nfetch(`/finished-jobs?page=${page}&rows=10`);","handlingStrategy":"validation","validationCode":"int page = Math.max(1, requestedPage);","typeGuard":"boolean isPositivePage(int p) { return p >= 1; }","tryCatchPattern":"try { fetchPage(page, rows); } catch (IllegalArgumentException e) { fetchPage(1, rows); }","preventionTips":["Treat pagination as 1-based in all clients","Clamp user-controlled page inputs before requests","Document the parameter contract in API docs"],"tags":["rest","pagination","validation"],"backgroundTag":"value-out-of-range","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T21:17:11.552Z"}