Class GenericFilterController<T,D,C,U>
java.lang.Object
com.aceelv.utilsmongodb.pagination.GenericFilterController<T,D,C,U>
- Type Parameters:
T
- Tipo de entidad de dominio (ej: User, Product, Order)D
- Tipo de DTO de respuesta (ej: UserResponseDto, ProductDto)C
- Tipo de DTO de creación (ej: UserCreateDto, CreateProductRequest)U
- Tipo de DTO de actualización (ej: UserUpdateDto, UpdateProductRequest)
Controlador genérico base para operaciones de filtrado y paginación con MongoDB.
Esta clase abstracta proporciona un endpoint REST estándar para operaciones de
filtrado y paginación. Maneja automáticamente la validación, transformación de DTOs,
y formateo de respuestas usando ResultResponse
.
CaracterÃsticas Principales:
- Endpoint POST /filter para consultas complejas
- Manejo automático de errores con códigos HTTP apropiados
- Transformación automática de entidades a DTOs de respuesta
- Respuestas estandarizadas con
ResultResponse
- Validación automática de parámetros de entrada
- Manejo de excepciones con mensajes informativos
Ejemplo de Implementación:
@RestController
@RequestMapping("/api/users")
public class UserController extends GenericFilterController<User, UserResponseDto, UserCreateDto, UserUpdateDto> {
public UserController(
GenericPaginationService<User, String> paginationService,
UserMapper userMapper) {
super(paginationService, userMapper);
}
// El endpoint /filter ya está implementado automáticamente
// Puedes agregar endpoints adicionales especÃficos para usuarios
@GetMapping("/{id}")
public ResponseEntity<ResultResponse<UserResponseDto, String>> getUser(@PathVariable String id) {
// Implementación especÃfica
return ResponseEntity.ok(ResultResponse.success(userMapper.toResponse(user)));
}
}
Configuración del Bean:
@Configuration
public class UserConfig {
@Bean
public GenericPaginationService<User, String> userPaginationService(
UserRepository userRepository,
MongoTemplate mongoTemplate) {
return new GenericPaginationService<>(userRepository, mongoTemplate, User.class);
}
}
Ejemplo de Petición HTTP:
POST /api/users/filter
Content-Type: application/json
{
"page": 1,
"pageSize": 10,
"searchString": "john",
"searchFields": [
{"fieldName": "name", "value": null},
{"fieldName": "email", "value": null}
],
"uuids": [
{"fieldName": "status", "value": "ACTIVE"}
],
"sortOrders": [
{"fieldName": "createdAt", "direction": -1}
]
}
Ejemplo de Respuesta Exitosa:
{
"result": {
"content": [
{
"id": "507f1f77bcf86cd799439011",
"name": "John Doe",
"email": "john@example.com",
"status": "ACTIVE",
"createdAt": "2024-01-15T10:30:00"
}
],
"totalElements": 150,
"totalPages": 15,
"size": 10,
"number": 0,
"numberOfElements": 10,
"first": true,
"last": false
},
"isSuccess": true,
"errors": null,
"message": "Se encontraron 10 resultados de 150 totales",
"messageCode": "PAGINATION_SUCCESS",
"timestamp": "2025-06-28T15:30:45.123",
"code": 200
}
Ejemplo de Respuesta de Error:
{
"result": null,
"isSuccess": false,
"errors": [
"El tamaño de página debe ser al menos 1",
"String de búsqueda demasiado largo (máximo 200 caracteres)"
],
"message": "validation error",
"messageCode": "VALIDATION_ERROR",
"timestamp": "2025-06-28T15:30:45.123",
"code": 400
}
- Since:
- 1.0
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected final EntityDtoMapper<T,
D, C, U> Mapper para convertir entre entidades y DTOs.protected final GenericPaginationService<T,
String> Servicio de paginación que maneja todas las operaciones de consulta. -
Constructor Summary
ConstructorsModifierConstructorDescriptionprotected
GenericFilterController
(GenericPaginationService<T, String> paginationService, EntityDtoMapper<T, D, C, U> mapper) Constructor que inicializa el controlador con sus dependencias. -
Method Summary
Modifier and TypeMethodDescriptionorg.springframework.http.ResponseEntity<ResultResponse<org.springframework.data.domain.Page<D>,
String>> filter
(FilteredRequest request) Endpoint para realizar consultas con filtros, búsqueda y paginación.protected EntityDtoMapper<T,
D, C, U> Método auxiliar protegido para obtener el mapper.
-
Field Details
-
paginationService
Servicio de paginación que maneja todas las operaciones de consulta. -
mapper
Mapper para convertir entre entidades y DTOs.
-
-
Constructor Details
-
GenericFilterController
protected GenericFilterController(GenericPaginationService<T, String> paginationService, EntityDtoMapper<T, D, C, U> mapper) Constructor que inicializa el controlador con sus dependencias.- Parameters:
paginationService
- Servicio que maneja las operaciones de paginación y filtradomapper
- Mapper para convertir entre entidades y DTOs- Throws:
IllegalArgumentException
- si algún parámetro es null
-
-
Method Details
-
filter
@PostMapping("/filter") public org.springframework.http.ResponseEntity<ResultResponse<org.springframework.data.domain.Page<D>,String>> filter(@RequestBody FilteredRequest request) Endpoint para realizar consultas con filtros, búsqueda y paginación.Este endpoint acepta una petición con todos los criterios de filtrado y retorna una página de resultados transformados a DTOs de respuesta.
Procesamiento de la Petición:
- Valida automáticamente todos los parámetros de entrada
- Ejecuta la consulta con filtros y paginación
- Transforma las entidades a DTOs de respuesta
- Formatea la respuesta con metadatos adicionales
- Maneja errores y excepciones apropiadamente
Códigos de Respuesta HTTP:
- 200 OK: Consulta ejecutada exitosamente
- 400 Bad Request: Errores de validación en los parámetros
- 500 Internal Server Error: Errores internos del servidor
- Parameters:
request
- Petición con criterios de filtrado, búsqueda y paginación- Returns:
- Respuesta con página de resultados o información de error
Nota: Este endpoint utiliza POST en lugar de GET para permitir peticiones complejas con múltiples filtros que excedan los lÃmites de longitud de URL en peticiones GET.
-
getMapper
Método auxiliar protegido para obtener el mapper.Permite a las clases hijas acceder al mapper para operaciones adicionales de transformación de datos.
- Returns:
- El mapper configurado para este controlador
-