Mudar a url-pattern do filtro do VRaptor

Olá, me deparei com o seguinte problema.

Normlamente, o filter-mapping do VRaptor é assim:

<filter-mapping> <filter-name>vraptor</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Na nossa aplicação, tivemos a necesseidade de mudar o url-pattern, assim:

<filter-mapping> <filter-name>vraptor</filter-name> <url-pattern>/vraptor/*</url-pattern> </filter-mapping>
Com essa alteração o VRaptor para de resolver as URLs.
Fiz um teste com uma aplicação do zero, criada com VRaptor Scaffold e o erro também acontece. Testei com o vraptor 3.2.0 e 3.3.0.

Esse comportamento é normal, ou é um bug?

valeu

Se você está em um ambiente com Servlet 3, talvez você precise colocar isso aqui logo abaixo da tag web-app do seu web.xml.

[quote=garcia-jj]Se você está em um ambiente com Servlet 3, talvez você precise colocar isso aqui logo abaixo da tag web-app do seu web.xml.

Os testes que fiz não foram em ambiente com Servlet 3. Testei com JBoss 4.2.3 e Jetty 6

se vc vai interceptar só /vraptor/* todas as urls do VRaptor precisarão começar com /vraptor, então vc tem que sobrescrever um dos componentes do VRaptor

faz esse teste:

troca uma de suas lógicas que tão com @Path("/qqercoisa") por @Path("/vraptor/qqercoisa") e vê se funciona

se funcionar eu te conto como fazer a configuração pro vraptor fazer automaticamente…

porque vc precisa disso mesmo?

Olá Lucas, pode contar!?

Eu preciso disso pois tenho que “reservar” uma pasta para o JAAS proteger. E não quero mudar o nome de todos os @Path’s por causa disso.

Obrigado

crie essa classe:

@Component
@ApplicationScoped
public class MeuRoutesParser extends PathAnnotationRoutesParser {

    //delega o construtor
   @Override
   protected void fixURIs(Class<?> type, String[] uris) {
        for (int i = 0; i < uris.length; i++) {
            uris[i] = "/seuprefixo" + uris[i];
        }
   }
}

Encontrei uma maneira:

@Component
@ApplicationScoped
public class MyRouteParser extends PathAnnotationRoutesParser {

	public MyRouteParser(Router router) {
		super(router);
	}
	
	@Override
	protected String extractPrefix(Class&lt;?&gt; arg0) {
		return &quot;/app&quot;;
	}
	
}

Ainda da pra complementar com um POG:

@Component  
@RequestScoped
public class MyResourceHandler extends DefaultResourceNotFoundHandler {

	private final Router router;
	private final Result result;

	public MyResourceHandler(Router router, Result result) {
		this.router = router;
		this.result = result;
	}
	
	@Override
	public void couldntFind(RequestInfo requestInfo) {
		try {
			String uri = requestInfo.getRequestedUri();
			if (!uri.startsWith(&quot;/app/&quot;)) {
				tryMovePermanentlyTo(requestInfo, &quot;/app&quot; + uri);
			}
		} catch (Exception e) {
			super.couldntFind(requestInfo);
		}
	}
	
	private void tryMovePermanentlyTo(RequestInfo requestInfo, String newUri) {  
        router.parse(newUri, HttpMethod.of(requestInfo.getRequest()), 
            requestInfo.getRequest());  
        result.use(Results.status()).movedPermanentlyTo(newUri);  
    }
	
}

Não sei se essa segunda parte afeta a performance.

precisa do notFoundHandler? se vc muda as rotas teoricamente não precisa disso.

Preciso para não alterar os jsps que já estão apontando para o caminho antigo.

Tem forma melhor de resolver?

vc tah colocando as jsps em /WEB-INF/jsp/prefixo//.jsp?

a URI que chega no controller não afeta o caminho do jsp… por padrão vai continuar sendo /WEB-INF/jsps//.jsp

Não é isso.

Serve para alterar os links das paginas:

<a href="${base}/home/xpto">xpto</a>

${base} = request.getContextPath()

Ao clicar ele vai redirecionar para /app/home/xpto

Assim não preciso mudar todos os jsps que apontam para um controller.

se vc tá usando o vraptor 3.4.0, vc pode fazer:

<a href="${linkTo[MeuController].meuMetodo}">xpto</a>

ou simplesmente mudar a variavel ${base} :wink:

Legal, obrigado pelas dicas