¿Por qué cuando Pageable es parámetro, no ocurre error con PageNo muy grande y se convierte a 0?
Análisis de la causa y principio de operación interno del fenómeno donde valores de página que exceden el rango int se convierten a 0 en Spring Boot Pageable.
Entorno de la situación
spring boot 3.2.9,jdk17
Situación que ocurrió
Mientras implementaba consulta de paginación de datos grandes, descubrí un fenómeno interesante. (Si ya lo sabe, pase)
Al usar parámetroPageable, a pesar de ingresar un número muy grande que excede el rangoint(ej:10 mil millones) como valor depage
contrario a lo esperado (diferente al método de implementación directa) no ocurrió error y consultó la primera página (pageNo = 0) devolviendo el resultado.
Fue un resultado diferente a cuando lo implementé directamente usando @RequestParam antes
En este artículo veremos la causa y cómo está operando.
¿Qué es Pagination usando Pageable?
Generalmente, muchos foros web no muestran todas las publicaciones a la vez sino que las proporcionan divididas por página por número de página.
También puede configurar el método de ordenación para establecer la prioridad de la información que desea ver, entregar información según la solicitud del método de ordenación, tamaño de página y qué número de página es Pagination.
El desarrollador puede implementar esto directamente, pero Spring Data proporciona una interfaz llamada Pageable para usar esto convenientemente.
Recreación de la situación
Consulta usando Pageable
Como la imagen de abajo, recreé simplemente un método que recibe Pageable como parámetro para consulta.
En este caso, cuando solicité consulta estableciendo querystring page a 10 mil millones, contrario a lo esperado podemos confirmar que consulta la página 0.
Apariencia de traer la primera página
Consulta a través de implementación directa con @requestParam
En el contenido anterior de hecho pensé que era interesante.. porque recuerdo que cuando implementé directamente usando requestParam sin usar pageable antes ocurrió error con respuesta 400 bad request.
Así que recreé una vez más abajo y como esperaba como la imagen de abajo ocurrió error de que falló al convertir ese valor a int en HandlerExceptionResolver.
¿Por qué no ocurre error?
Para encontrar la causa de este fenómeno hice depuración,
Aprendí que en Spring cuando recibe objeto Pageable directamente como parámetro, opera la clase PageableHandlerMethodArgumentResolverSupport.
Esta clase tiene el rol de convertir parámetros de solicitud a objeto Pageable a través del método getPageable.
En este proceso se llama el método parseAndApplyBoundaries, y la causa del artículo ocurre en este método.
El método parseAndApplyBoundaries está capturando NumberFormatException que ocurre cuando el número de página es demasiado grande (excede 2.1 mil millones),
Gracias a esto, está diseñado para devolver la primera página (0) en el acceso real de datos.
Como resultado incluso si ingresa un valor que excede el rango int, no ocurre error y se devuelve la primera página..
Conclusión
Si entiende este método de operación al usar Pageable, también será más fácil manejar claramente cuando ocurra la misma situación. Espero que este artículo ayude a entender casos especiales donde opera diferente a la forma existente de implementación al usar Pageable, y ayude en una mejor implementación de paginación.







