[RESOLVIDO] VRaptor3 - URI nao encontrada quando parametro tipo String está vazio

7 respostas
L

Método:

@Get
    @Liberado
    @Path({"lista","lista/{order}/{page}/{cboFiltro}/{txtFiltro}"})
    public void lista(String order, Integer page, String cboFiltro, String txtFiltro) {
    }

Quando as Strings cboFiltro e txtFiltro estão vazias, acontece um erro:

Alguém se habilita???

7 Respostas

L

Tentei até usar a solução do Livro de Receitas do site: Aceitando URLs com ou sem barra no final

Mas não funcionou!!!

G

Se o parametro é opcional não faz sentido algum você passar via “nice urls”. Esse recurso é ideal para você deixar a url mais botinha e principalmente quando você digita direto o url, e não para envio de formulário.

Use algo como @Path(“lista”) apenas.

Abraços

L

mas é isso q estou fazendo, to chamando direto na url…

veja o meu código:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Localidades</title>
        <link href="<c:url value="/css/estilo.css"/>" rel="stylesheet" type="text/css">
    </head>
    <body class="lstBODY">
        <center>
            <table class="lstTab" cellspacing="0">
                <tr>
                    <td colspan="4">
                        <table class="lstTopoTABLE" cellspacing="0">
                            <tr class="lstTopoTR">
                                <td class="lstTopoTD">
                                    Localidades
                                </td>
                            </tr>
                            <tr class="lstFiltroTR">
                                <td class="lstFiltroTD">
                                    <form action="<c:url value="/principal/localidade/lista"/>" method="get">
                                        <input id="page" name="page" type="hidden" value="${page}" />
                                        <input id="order" name="order" type="hidden" value="${order}" />
                                        Filtrar por :
                                        <select id="cboFiltro" name="cboFiltro">
                                            <option value="id">Id</option>
                                            <option value="nome">Nome</option>
                                        </select>
                                        <script language="javascript">document.getElementById('cboFiltro').value="${cboFiltro}"</script>
                                        <input id="txtFiltro" name="txtFiltro" type="text" size="50" value="${txtFiltro}"/>
                                        <input type="submit" value="Filtrar"/>
                                    </form>
                                </td>
                            </tr>
                        </table>
                    </td>
                </tr>
                <tr class="lstTrTit">
                    <td class="lstTdTit" width="10%">
                        <a class="lstLinkTit" href="<c:url value="/principal/localidade/lista/id/${page}/${cboFiltro}/${txtFiltro}"/>">ID</a>
                    </td>
                    <td class="lstTdTit" width="60%">
                        <a class="lstLinkTit" href="<c:url value="/principal/localidade/lista/nome/${page}/${cboFiltro}/${txtFiltro}"/>">NOME</a>
                    </td>
                    <td class="lstTdTit" width="15%">
                        <a class="lstLinkTit" href="<c:url value="/principal/localidade/lista/cep/${page}/${cboFiltro}/${txtFiltro}"/>">CEP</a>
                    </td>
                    <td class="lstTdTit" width="15%">
                        <a class="lstLinkTit" href="<c:url value="/principal/localidade/lista/siglaUf.sigla/${page}/${cboFiltro}/${txtFiltro}"/>">UF</a>
                    </td>
                </tr>
                <c:forEach items="${localidadeList}" var="loc">
                    <tr class="lstTrReg" onMouseOver="this.className='lstTrRegMouse'" onMouseOut="this.className='lstTrReg'">
                        <td class="lstTdReg">${loc.id}</td>
                        <td class="lstTdReg">${loc.nome}</td>
                        <td class="lstTdReg">${loc.cep}</td>
                        <td class="lstTdReg">${loc.siglaUf.descricao}</td>
                    </tr>
                </c:forEach>
                <tr class="lstTrPag">
                    <td class="lstTdPag" colspan="4">
                        <c:if test="${pageFirst != null}">
                            <a class="lstLinkPag" href="<c:url value="/principal/localidade/lista/${order}/${pageFirst}/${cboFiltro}/${txtFiltro}"/>">Primeira</a>
                            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                        </c:if>
                        <c:if test="${pagePrev != null}">
                            <a class="lstLinkPag" href="<c:url value="/principal/localidade/lista/${order}/${pagePrev}/${cboFiltro}/${txtFiltro}"/>">Anterior</a>
                            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                        </c:if>
                        Página ${page} de ${pageCount}
                        <c:if test="${pageNext != null}">
                            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                            <a class="lstLinkPag" href="<c:url value="/principal/localidade/lista/${order}/${pageNext}/${cboFiltro}/${txtFiltro}"/>">Próxima</a>
                        </c:if>
                        <c:if test="${pageLast != null}">
                            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                            <a class="lstLinkPag" href="<c:url value="/principal/localidade/lista/${order}/${pageLast}/${cboFiltro}/${txtFiltro}"/>">Última</a>
                        </c:if>
                    </td>
                </tr>
            </table>
        </center>
    </body>
</html>

e o Resource:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.caelum.vraptor.logicas.principal;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.interceptadores.Liberado;
import br.com.caelum.vraptor.hibernate.DaoGenerico;
import br.com.caelum.vraptor.util.ConversorReflection;
import br.com.caelum.vraptor.util.PaginaUtil;
import br.com.hibernate.Consulta;
import br.com.hibernate.pojos.principal.Localidade;
import java.util.List;

/**
 *
 * @author Lauro
 */
@Resource
@Path("/principal/localidade")
public class LocalidadeController {

    private DaoGenerico dao;
    private Result result;

    public LocalidadeController(DaoGenerico dao, Result result) {
        this.dao = dao;
        this.result = result;
    }

    @Get
    @Liberado
    @Path({"lista","lista/{order}/{page}/{cboFiltro}/{txtFiltro}"})
    public void lista(String order, Integer page, String cboFiltro, String txtFiltro) {

        page = page!=null? page : 1;
        order = order!=null? order : "nome";
        cboFiltro = cboFiltro!=null? cboFiltro : "";
        txtFiltro = txtFiltro!=null? txtFiltro : "";

        System.out.println("txt "+txtFiltro);


        Consulta consulta = new Consulta(dao.getSession(), Localidade.class);
        consulta.setPagina(page,Consulta.TAMANHO_PAGINA);
        consulta.addOrdemAsc(order);

        if(!cboFiltro.isEmpty() && !txtFiltro.isEmpty()){
            Object obj = ConversorReflection.converte(Localidade.class, cboFiltro, txtFiltro);
            if(obj!=null){
                consulta.addCriterio(cboFiltro, obj);
            }
        }

        PaginaUtil.include(result,consulta.getQtdeRegistros(),page,Consulta.TAMANHO_PAGINA);

        List<Localidade> lista = consulta.getLista();

        result.include("order", order);
        result.include("cboFiltro", cboFiltro);
        result.include("txtFiltro", txtFiltro);
        result.include("localidadeList", lista);

    }
    
}

Quando chamo direto pela url e os parametros de filtro estão vazios dá erro 404. Quando não, passa tranquilo.

L

se vc está esperando um parâmetro via URI e não passa nada não vai funcionar mesmo…

se vc tem @Path(“abc/{def}/{ghi}”), vc só vai poder chamar uris do tipo abc/xxx/yyyyy, abc/awerq/sdkfjasd… não funciona omitir nenhum parâmetro…

como o garcia falou, se o parâmetro é opcional, não deveria fazer parte da uri

L

ok…

entao eu terei de motar a uri com:

???

outra coisinha… acho que um erro primário meu:

se eu chamo uma uri direto assim: recurso/metodo/vitó
quando eu recebo o parametro ele vem assim: vit%63%61 (nao lembro exatamente os numeros…)

como resolvo isso???

G

Sim. Isso quando você tem parametros enviados via HTTP/GET. No caso do post esses valores não aparecem na URI.

outra coisinha… acho que um erro primário meu:

se eu chamo uma uri direto assim: recurso/metodo/vitó
quando eu recebo o parametro ele vem assim: vit%63%61 (nao lembro exatamente os numeros…)

como resolvo isso???

Isso não é resolvido porque não é um problema. Sempre que você faz uma requisição o navegador converte todos os parametros para ASCII antes de fazer a requisição. Isso é padronizado. %20 por exemplo é um espaço, então ao invés de na requisição você ter algo como “vraptor 3” você terá “vraptor%203”. Mas se você tentar imprimir o valor desse parametro notará que ele aparece como “vraptor 3” correto, sem aquele código ascii.

Abraços

L

Perdão pessoal!!!

Agora entendi… se eu chamar: recurso/metodo/vitó
vitó, para o navegador, não é um parâmetro… faz parte da uri…
porém, se eu chamar recurso/metodo?txt=vitó
vitó agora é um parametro… e será convertido para ascii

Vou parar um pouco aqui… desde domingo to estudando vraptor e implementando um projeto…

acho que precisode uma cerveja!!! e tirar “os sonos” atrasados!!!

Garcia e Lucas… Muito obrigado!!! valeu!!

Criado 16 de fevereiro de 2010
Ultima resposta 17 de fev. de 2010
Respostas 7
Participantes 3