Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Duvida sobre requisições com mais de um parâmetro

Olá, estou desenvolvendo uma API referente ao quarto challenge da Alura. Em uma das tarefas precisamos implementar uma requisição do tipo GET com o parâmetro da descrição, esse parâmetro não é obrigatório, ou seja, se não existir parâmetro a API deve buscar todas as informações (Essa parte consegui implementar).

Estou tentando adicionar a opção para um segundo parâmetro, fazendo uma busca também por categoria. Os parâmetros também não devem ser obrigatórios, utilizei até da anotação @RequestParam(required = false) tanto em descrição, quanto categoria. Mas, ao tentar realizar o teste pelo insomnia passando somente a descrição, recebo um NullPointerException por causa da categoria.

Obs: Ao passar a categoria e deixar sem a descrição, a API consegue fazer a requisição.

Segue o código: Controller -> ExpenseController

Service -> Nesta parte, verifiquei que mesmo com a anotação, o parâmetro de categoria está como NotNull mesmo com required = false Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Repository -> Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Se puderem me auxiliar, agradeço. Repositório do GitHub -> https://github.com/gentilsilva/alura-budgetControlAPI

2 respostas

Oi Gentil!

Como ambos os parâmetros são opcionais você deveria ter 3 ifs então:

if (description != null && category != null) {
    //buscar por descricao e categoria
} else if (description != null) {
    //buscar apenas por descricao
} else if (category != null) {
    //buscar apenas por categoria
} else {
    // buscar sem filtros
}

Assim você cobre todas as possibilidades. A desvantagem é que o código começa a ficar complicado, principalmente se surgir um terceiro parâmetro opcional.

Outra alternativa é utilizar um "truque" de sql para evitar os ifs:

@Query("SELECT e FROM Expense e WHERE (:description IS NULL OR e.description = :description) AND (:category IS NULL OR e.category = :category)")
Page<Expense> findAllByOptionalFilters(String description, Category category, Pageable pageable);

Bons estudos!

solução!

Opa Rodrigo!

Utilizei a segunda alternativa e funcionou, obrigado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software