Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida com buscas na página de listagem

Olá a todos, mais uma dúvida boba de quem tá vindo de 10 anos de frameworks baseados em componentes.

Eu tenho no meu controlador, o método que redireciona para a página de listagem de estabelecimentos, neste método eu recebo por injeção um Objeto chamado Pageable, que guarda alguns dados sobre a requisição e também uma string que é uma busca, pois na página de listagem o usuário pode pesquisar por nome de estabelecimento, se o valor de filtro estiver nulo, ele traz todos, na verdade traz todos paginados de 10 em 10.

    @Get("/estabelecimentos")
    public void lista(Pageable pageable, String filtro){
        Page<Estabelecimento> pagina = estabelecimentos.pesquisar(pageable,filtro);
        result.include("page",pagina);    
    }
<form method="GET" action="<c:url value="/estabelecimentos"/>">
            <div class="row">
                <div class="form-group  col-sm-12">
                    <label class="control-label" for="nome">Nome:</label>
                    <input type="text" class="form-control" id="nome" name="nome" autofocus="autofocus" value="${nome}"/>
                </div>
            </div>

            <button type="submit" class="btn  btn-primary">Pesquisar</button>
        </form>

Logo vi que este meu código era um pouco problemático, pois logo após salvar ou atualizar um estabelecimento eu redireciono para a página de listagem, para fazer isso eu teria que fazer:

result.redirectTo(EstabelecimentoController.class).lista(null,null);

oque não faz muito sentido pois o objeto pageable carrega dados sobre o request e não deve ser nulo. Então fiz o seguinte:

@Inject private Pageable pageable;
@Inject private HttpRequest request;

    @Get("/estabelecimentos")
    public void lista(){
    String filtro= request.getParameter("nome");        
        Page<Estabelecimento> pagina = estabelecimentos.pesquisar(pageable,filtro);
        result.include("page",pagina);    
    }

A solução acima funciona, mas dessa forma perco uma das grandes vantagens do framework que é popular automaticamente os objetos sem que eu precise ficar pegando eles do request, esse filto é apenas uma String, mas poderia ser um objeto complexo.

Pra contarnar isso, pensei o seguinte: então vou criar uma outra url, para que quando o usuário pesquise, eu receba o filtro e redirecione para a página de listagem

@Inject private Pageable pageable;

    @Get("/estabelecimentos")
    public void lista(){    
        Page<Estabelecimento> pagina = estabelecimentos.pesquisar(pageable,null);
        result.include("page",pagina);    
    }

    @Get("/estabelecimentos/{filtro}")
    public void pesquisar(String filtro){
        Page<Estabelecimento> pagina = estabelecimentos.pesquisar(pageable,fitro);
        result.include("page",pagina);
//gostaria de utilizar a página de listagem    

    }

empaquei bem aqui, pois se eu chamar a página de listagem no método pesquisar, ele vai fazer novamente a busca sem o filtro e vai sobrescrever a busca do usuário, estou sem idéia de como fazer isso. Alguém tem alguma sugestão?

1 resposta
solução!

Oi Ricardo, ótimas tentativas. Eu ficaria com a primeira... Tentaria deixar o Pageable desacoplado do request, um objeto possível de ser montado na mão mesmo. Com isso, você poderia chamar o método a partir do outro sem muitos problemas.

Faço bastante isso nos meus projetos.

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