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?
dgouvea
Janeiro 19, 2012, 1:18pm
#5
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];
}
}
}
dgouvea
Janeiro 19, 2012, 1:41pm
#7
Encontrei uma maneira:
@Component
@ApplicationScoped
public class MyRouteParser extends PathAnnotationRoutesParser {
public MyRouteParser(Router router) {
super(router);
}
@Override
protected String extractPrefix(Class<?> arg0) {
return "/app";
}
}
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("/app/")) {
tryMovePermanentlyTo(requestInfo, "/app" + 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.
dgouvea
Janeiro 19, 2012, 1:48pm
#9
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
dgouvea
Janeiro 19, 2012, 1:55pm
#11
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}
dgouvea
Janeiro 19, 2012, 2:06pm
#13
Legal, obrigado pelas dicas