Configurar el controlador de manera que los clasificadores opcionales puedan ser activados/desactivados en base a la entrada del controlador

votos
1

Estoy tratando de escribir un punto final que permita el uso de clasificadores opcionales en el backend.

Por ejemplo, tengo un clasificador que me permite ordenar los elementos de una lista - que es lo que devuelve el controlador de mi punto final - en base a su fecha de creación. Si el parámetro correspondiente del controlador es verdadero, entonces los elementos se ordenan comenzando por los más nuevos y avanzando hacia los más antiguos. Si el parámetro correspondiente es falso, entonces lo opuesto.

Este es un proyecto de Spring Boot.

Me preguntaba si hay una forma más apropiada para lograr esto

Este es mi controlador:

@RestController
public class StudentsController{
    @Autowired
    private GradeBook yearlyGrades;

    @GetMapping(/successful)
    public List<Student> getSuccessfulStudents(
        @RequestParam(name = startDate) Instant startDate,
        @RequestParam(name = endDate) Instant endDate,
        @RequestParam(defaultValue = false, required = false) boolean sortStartingFromHighestGrade,
        @RequestParam(defaultValue = false, required = false) boolean sortStartingFromEarliestDate) {


        return this.yearlyGrades.getSuccessfulStudents(startDate, endDate, 
                                                       sortStartingFromHighestGrade, 
                                                       sortStartingFromEarliestDate);
    }
}

Dependiendo del valor verdadero/falso de los dos últimos parámetros sortStartingFromHighestGradey sortStartingFromEarliestDate, se produce un procesamiento diferente en el fondo en la clase de servicio.

Publicado el 15/05/2020 a las 21:22
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

Podrías implementar la clasificación con Spring con el soporte de Pageable.

Creará un objeto Pageable para obtener los datos de la BD.

Tienes que usar PagingAndSortingRepositorypara Spring Data:

public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Integer> {

Y llame al regular .findAll(pageable)con cualquier opción de clasificación para su entidad en la capa de servicio.

Y tu controlador se verá algo así como:

@GetMapping
public Page<Student> getSuccessfulStudents(
        @RequestParam(name = "startDate") Instant startDate,
        @RequestParam(name = "endDate") Instant endDate,
        @RequestParam(value = "page", required = false, defaultValue = "0") int page,
        @RequestParam(value = "size", required = false, defaultValue = "10") int size) {
    return yearlyGrades.getSuccessfulStudents(startDate, endDate,
                 PageRequest.of(page, size, Sort.by("propertyFromClass")));
}

Si no quieres regresarPage<Entity>, puedes convertirlo a Lista en la capa de servicio.

ACTUALIZACIÓN:

En lugar de crear Pageable objeto por PageRequest.of(), podrías pasarla directamente por la URL:

/exitoso?page=0&size=10&sort=grade

donde gradehay un campo de la clase de los estudiantes.

o

/exitoso? página=0&tamaño=10&clasificación=grado,preguntar

Todos los parámetros reconocidos internamente por Pageable son los siguientes:

page - Page number

size - Page Size

sort - sort by (Order by)

direction - ASC / DESC

Entonces tu controlador debería ser:

@GetMapping("/successful")
public List<Student> getSuccessfulStudents(
    @RequestParam(name = "startDate") Instant startDate,
    @RequestParam(name = "endDate") Instant endDate,
    Pageable pageable) {
    return yearlyGrades.getSuccessfulStudents(startDate, endDate, pageable);
}

Referencias útiles:

Respondida el 17/05/2020 a las 22:53
fuente por usuario

votos
0

La primavera puede ser útil de múltiples maneras aquí:

  1. Desde el punto de vista del MVC de la primavera no tienes que suministrar todos los parámetros de la solicitud en variables separadas, en su lugar puedes definir una clase con todos estos parámetros y la primavera los mapeará para ti:
public class Params {
  private Instant startDate;
  private Instant endDate;
  private int page = 0;
  private int size = 10;
  ... constructor/getters/setters ...
}

Entonces en su controlador puede hacer lo siguiente, IMHO, se ve más limpio:

@GetMapping
public Page<Student> getSuccessfulStudents(Params params) {
   ...
}

Como @nazar_art ha mencionado, puedes usar el soporte Pageable de datos de primavera si tienes datos de primavera De lo contrario tendrás que implementarlo por ti mismo, lo cual no es gran cosa de todos modos.

Respondida el 21/05/2020 a las 15:46
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more