Configure o controlador de forma que os separadores opcionais possam ser habilitados/desabilitados com base na entrada do controlador

votos
43

Estou tentando escrever um endpoint que permita o uso de separadores opcionais no backend.

Por exemplo, eu tenho um classificador que me permite classificar elementos em uma lista - que é o que o controlador do meu endpoint retorna - com base na data de criação deles. Se o parâmetro correspondente do controlador for verdadeiro, então os elementos são ordenados a partir do mais novo e movendo-se para o mais antigo. Se o parâmetro correspondente é falso, então o oposto.

Este é um projecto de Spring Boot.

Eu estava me perguntando se existe uma maneira mais apropriada de se conseguir isso?

Este é o meu 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);
    }
}

Dependendo do valor verdadeiro/falso dos dois últimos parâmetros sortStartingFromHighestGradee sortStartingFromEarliestDate, o processamento diferente acontece em segundo plano na classe de serviço.

Publicado 15/05/2020 em 21:22
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

Você pode implementar a ordenação com Spring com suporte a Pageable.

Você vai criar um objeto Pageable para obter os dados do DB.

Você tem que usar PagingAndSortingRepositorypara Spring Data:

public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Integer> {

E ligar regularmente .findAll(pageable)com qualquer opção de ordenação para a sua entidade na camada de serviço.

E o seu controlador irá parecer-se com algo assim:

@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")));
}

Se você não quiser retornar Page<Entity>você pode convertê-lo para Listar no estrato de serviço.

ATUALIZAR:

Em vez de criar Pageable você poderia passá-lo diretamente pelo PageRequest.of()URL:

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

onde gradeé um campo da turma do aluno.

ou

/successful?page=0&size=10&sort=grade,pergunte

Todos os parâmetros são reconhecidos internamente por Pageable como os seguintes:

page - Page number

size - Page Size

sort - sort by (Order by)

direction - ASC / DESC

Então o seu controlador deve 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);
}

Referências úteis:

Respondeu 17/05/2020 em 22:53
fonte usuário

votos
0

A Primavera pode ser útil de várias maneiras aqui:

  1. Do ponto de vista do Spring MVC você não precisa fornecer todos os parâmetros de solicitação em variáveis separadas, ao invés disso você pode definir uma classe com todos esses parâmetros e o Spring irá mapeá-los para você:
public class Params {
  private Instant startDate;
  private Instant endDate;
  private int page = 0;
  private int size = 10;
  ... constructor/getters/setters ...
}

Então no seu controlador você pode fazer o seguinte, IMHO, parece mais limpo:

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

Como @nazar_art mencionou, você pode usar o suporte Pageable de dados Spring se você tiver dados Spring, caso contrário você terá que implementá-lo por você mesmo, o que não é uma grande coisa de qualquer forma.

Respondeu 21/05/2020 em 15:46
fonte usuário

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