{"record":{"id":"097fe6e7333ce2e5","repo":"alibaba/nacos","slug":"pageno-and-pagesize-must-be-greater-than-zero-097fe6","errorCode":null,"errorMessage":"pageNo and pageSize must be greater than zero","messagePattern":"pageNo and pageSize must be greater than zero","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"warning","filePath":"plugin-default-impl/nacos-default-auth-plugin/src/main/java/com/alibaba/nacos/plugin/auth/impl/persistence/embedded/AuthEmbeddedPaginationHelperImpl.java","lineNumber":68,"sourceCode":"     * @param args         query args\n     * @param pageNo       page number\n     * @param pageSize     page size\n     * @param rowMapper    Entity mapping\n     * @return Paging data\n     */\n    @Override\n    public Page<E> fetchPage(final String sqlCountRows, final String sqlFetchRows,\n        final Object[] args,\n        final int pageNo, final int pageSize, final RowMapper rowMapper) {\n        return fetchPage(sqlCountRows, sqlFetchRows, args, pageNo, pageSize, null, rowMapper);\n    }\n    \n    @Override\n    public Page<E> fetchPage(final String sqlCountRows, final String sqlFetchRows, Object[] args,\n        final int pageNo,\n        final int pageSize, final Long lastMaxId, final RowMapper rowMapper) {\n        if (pageNo <= 0 || pageSize <= 0) {\n            throw new IllegalArgumentException(\"pageNo and pageSize must be greater than zero\");\n        }\n        \n        // Query the total number of current records\n        Integer rowCountInt = databaseOperate.queryOne(sqlCountRows, args, Integer.class);\n        if (rowCountInt == null) {\n            throw new IllegalArgumentException(\"fetchPageLimit error\");\n        }\n        \n        // Count pages\n        int pageCount = rowCountInt / pageSize;\n        if (rowCountInt > pageSize * pageCount) {\n            pageCount++;\n        }\n        \n        // Create Page object\n        final Page<E> page = new Page<>();\n        page.setPageNumber(pageNo);\n        page.setPagesAvailable(pageCount);","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/alibaba/nacos/blob/9b989acdf181d00898f2e8839257bb2b2a3cefe3/plugin-default-impl/nacos-default-auth-plugin/src/main/java/com/alibaba/nacos/plugin/auth/impl/persistence/embedded/AuthEmbeddedPaginationHelperImpl.java#L50-L86","documentation":"Thrown by AuthEmbeddedPaginationHelperImpl.fetchPage (the embedded Derby variant) when pageNo or pageSize is less than or equal to zero. This is an input-validation guard on the pagination API before any SQL is executed. The method is used by auth controllers (user/role/permission listing) that delegate to the embedded database pagination helper.","triggerScenarios":"An HTTP request to an admin auth listing endpoint (e.g., /v3/admin/auth/users with pageNo=0 or pageSize=-1) reaches the pagination helper. The guard triggers before the SQL count query runs. Also triggered if a default integer value of 0 is used when a request parameter is omitted.","commonSituations":"Frontend sends default page parameters as 0 before user interaction; API client library defaults pageNo to 0; test code passes uninitialized pagination values; URL query params parsed as 0 when missing.","solutions":["Ensure pageNo starts at 1 and pageSize is at least 1 in all API calls.","Add client-side validation to default missing/zero pageNo to 1 and pageSize to a reasonable default (e.g., 20).","If building a custom controller, validate the form parameters before calling fetchPage and return a 400 with a clear message."],"exampleFix":"// before\nint pageNo = request.getParameter(\"pageNo\") != null\n    ? Integer.parseInt(request.getParameter(\"pageNo\")) : 0;\nPage<User> page = paginationHelper.fetchPage(countSql, fetchSql, args, pageNo, pageSize, mapper);\n\n// after\nint pageNo = request.getParameter(\"pageNo\") != null\n    ? Integer.parseInt(request.getParameter(\"pageNo\")) : 1;\nif (pageNo <= 0) pageNo = 1;\nif (pageSize <= 0) pageSize = 20;\nPage<User> page = paginationHelper.fetchPage(countSql, fetchSql, args, pageNo, pageSize, mapper);","handlingStrategy":"validation","validationCode":"// Validate pagination before calling fetchPage\nif (pageNo <= 0 || pageSize <= 0) {\n    throw new IllegalArgumentException(\"pageNo and pageSize must be >= 1\");\n}\nPage<E> page = paginationHelper.fetchPage(countSql, fetchSql, args, pageNo, pageSize, mapper);","typeGuard":"public static boolean isValidPagination(int pageNo, int pageSize) {\n    return pageNo > 0 && pageSize > 0;\n}","tryCatchPattern":"try {\n    Page<E> page = paginationHelper.fetchPage(countSql, fetchSql, args, pageNo, pageSize, mapper);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"pageNo and pageSize\")) {\n        return ResponseEntity.badRequest().body(\"Invalid pagination parameters\");\n    }\n    throw e;\n}","preventionTips":["Always default pageNo to 1 (not 0) in API request forms and frontend components.","Add form-level validation annotations (e.g., @Min(1)) on pagination parameters.","Document that Nacos uses 1-based page indexing."],"tags":["pagination","embedded-db","auth-plugin","input-validation","derby"],"backgroundTag":null,"analyzedSha":"9b989acdf181d00898f2e8839257bb2b2a3cefe3","analyzedAt":"2026-08-14T07:17:31.569Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}