Vraptor3 não encontre Url-pattern /vraptor/*

Fala pessoal, tudo certo?

Então, estou com implementando o vraptor em um projeto já existente e preciso que o vraptor intercepte somente determinadas urls, o que fiz, defini uma url específica para o filter mapping, porém ele não está encontrando a rota.

minha configuração:

     <filter>
        <filter-name>vraptor</filter-name>
        <filter-class>br.com.caelum.vraptor.VRaptor</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>vraptor</filter-name>
        <url-pattern>/vraptor/*</url-pattern>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

A resposta padrão que recebo é o 404 request resource is not avaible.

Cheguei a ver o Path resolver mas ele é somente para encontrar as respostas certo? ou ele também resolve o filtro de rota?

Alguma sugestão?

Abraços;

Qual o appserver e versão do mesmo que você está usando?

Tomcat 6;

Abraços;

[quote=diguix]Fala pessoal, tudo certo?

Então, estou com implementando o vraptor em um projeto já existente e preciso que o vraptor intercepte somente determinadas urls, o que fiz, defini uma url específica para o filter mapping, porém ele não está encontrando a rota.

minha configuração:

     <filter>
        <filter-name>vraptor</filter-name>
        <filter-class>br.com.caelum.vraptor.VRaptor</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>vraptor</filter-name>
        <url-pattern>/vraptor/*</url-pattern>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

A resposta padrão que recebo é o 404 request resource is not avaible.

Cheguei a ver o Path resolver mas ele é somente para encontrar as respostas certo? ou ele também resolve o filtro de rota?

Alguma sugestão?

Abraços;[/quote]

As páginas HTML você está salvando aonde?

o correto é em WEB-INF/jsp/

Acredito que seja esse o motivo do erro 404…

Boa sorte,

@joel

ele não está passando nem pelo filter, não a resposta que ele não está encontrando e sim o recurso ele nem chega no controller.

Pessoal,

o problema está no mapeamento do url-pattern com a especificação do 2.4 do Servlet, acho que não rola mesmo.

Mas se alguém tiver mais idéias, só mandar.

o problema é que se vc só aceita o que está dentro de /vraptor/*, quando você cria o controller:

@Resource
public class CabeloController {
   public void corta(){..}
}

o VRaptor espera que você chame o método corta pela URL:

http://localhost:8080/<contexto>/cabelo/corta

mas essa URL não vai passar pelo VRaptor! pq vc falou que só passam pelo vraptor as urls que começam com /vraptor

daí vc pode fazer duas coisas:
-anotar todas as lógicas com @Path("/vraptor/"
ou
-criar essa classe

@Component
@ApplicationScoped
public class MeuRoutesParser extends PathAnnotationRoutesParser {

    @Override
    protected String[] getURIsFor(Method javaMethod, Class<?> type) {
          String[] uris = super.getURIsFor(javaMethod, type);
          for(int i = 0; i < uris.length; i++) {
               uris[i] = "/vraptor" + uris[i];
          }
          return uris;
    }
}

isso deve funcionar

Lucas,

irei dar uma olhada com calma, cheguei a pensar na sugestão nessa sugestão,

…porém não testei, fiz agora e funcionou, vou implementar o RouteParser por que questão de elegância e responsabilidade da regra.

Valeu;

Lucas, o correto não é o vraptor levar em consideração do contexto quando resolver o path?

Penso que se o rapaz aí quer usar /vraptor no filter o Vraptor deveria resolver os paths conforme o contexto + caminho usado no filter.

mas esse /vraptor não é o contexto… é um caminho dentro do contexto…

não tem uma forma fácil do vraptor saber que foi configurado para uma url-pattern diferente do /* e se modificar pra usar o novo url-pattern…

[quote=Lucas Cavalcanti]mas esse /vraptor não é o contexto… é um caminho dentro do contexto…

não tem uma forma fácil do vraptor saber que foi configurado para uma url-pattern diferente do /* e se modificar pra usar o novo url-pattern…[/quote]

Lucas, escrevi um pouco confusa a frase, vou tentar escrever de novo.

Penso que o Vraptor deveria usar contexto + caminho-do-filtro-se-houver. Ou seja, no caso desse colega o correto deveria ser o vraptor usar os paths como /meu-contexto/vraptor/foo.

e como se pega o caminho do filtro?

Lucas, é uma boa pergunta. Vou pesquisar sobre isso. Mas pelo teor da tua pergunta realmente não tem como, estou certo?

Abraços

Na verdade eu realmente não sei :wink:

mas teoricamente a url do filtro não faz parte da sua configuração, faz parte apenas do(s) mapping(s)…

com a interface FilterConfig (que a gente tem acesso no filtro) só da pra saber o nome e os init params…

enfim, se tiver um jeito de saber deve ser uma gambiarra meio grande…

de qqer forma, a classe que eu postei acima deve resolver o caso em que o pattern não é /* e é fixo, então acho que não é necessário modificar o VRaptor por causa disso…

PS: desculpe pela pergunta agressiva =S

Lucas, não foi agressiva não. Sei que tu conhece muito bem a API dos servlets, então se você não sabe como pegar o path é porque realmente não tem como.

Mas assim, pensei um pouco e fiquei dividido se o Vraptor deve entender esses mapeamentos customizados ou não. Mas se o pessoal acha que é melhor o vraptor não interferir nisso, talvez seja melhor assim mesmo.

Mas nesse caso, se o diguix quer mesmo usar /vraptor/*, não dá para sobrescrever alguma convenção padrão para não precisar colocar /vraptor em todos os paths?

sim, com a classe que eu mandei em um dos posts acima:

@Component
@ApplicationScoped
public class MeuRoutesParser extends PathAnnotationRoutesParser {

    @Override
    protected String[] getURIsFor(Method javaMethod, Class<?> type) {
          String[] uris = super.getURIsFor(javaMethod, type);
          for(int i = 0; i < uris.length; i++) {
               uris[i] = "/vraptor" + uris[i];
          }
          return uris;
    }
}