Voltando ao tópico, hehe.
Lucas, fiz uma classe aqui que APARENTEMENTE resolveu o detalhe que comentei acima. Ocorre que não sou bem um mago do VRaptor e não sei bem as combinações possíveis de anotações que a galera costuma usar ou que são possíveis. Pode dar uma olhada nesse código, por gentileza?
A classe que cria a rota para o método é essa aqui:
package br.com.caelum.vraptor.blank;
import java.lang.reflect.Method;
import java.util.EnumSet;
import java.util.List;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.http.route.PathAnnotationRoutesParser;
import br.com.caelum.vraptor.http.route.Route;
import br.com.caelum.vraptor.http.route.RouteBuilder;
import br.com.caelum.vraptor.http.route.Router;
import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.resource.HttpMethod;
@Component @ApplicationScoped
public class IndexRouter extends PathAnnotationRoutesParser {
private final Router router;
public IndexRouter(Router router) {
super(router);
this.router = router;
}
@Override
protected List<Route> registerRulesFor(Class<?> baseType) {
List<Route> routes = super.registerRulesFor(baseType);;
Method method = getMethodIndex(baseType);
if (method != null){
String controllerName = super.extractControllerNameFrom(baseType);
RouteBuilder rule = router.builderFor(controllerName)
.with(EnumSet.noneOf(HttpMethod.class))
.withPriority(Path.LOWEST);
rule.is(baseType, method);
routes.add(rule.build());
}
return routes;
}
private Method getMethodIndex(Class<?> baseType){
try {
return baseType.getMethod("index");
} catch (SecurityException e) {
return null;
} catch (NoSuchMethodException e) {
return null;
}
}
}
Como pode ver minha idéia era direcionar a url “/caminho” para o método index() sem parametros, e a rota é incluida com a ultima prioridade…hã tá certo isso? :lol:
Eu testei com o projeto vraptor-blank, o controller foi esse aqui:
package br.com.caelum.vraptor.blank;
import br.com.caelum.vraptor.Resource;
@Resource
public class IndexController {
public void index() {
System.out.println("entrou no index");
}
}
Sem anotações, o que geraria a uri “/index/index”. Com a classe que fiz o log do VRaptor na subida da aplicação foi
10:12:49,601 INFO [DefaultRouteBuilder ] /index/index [ALL] -> IndexController.index()
10:12:49,602 INFO [DefaultRouteBuilder ] /index [ALL] -> IndexController.index()
e funcionou, tanto com “/index/index” quanto com “/index”. Testei anotando o método com @Path("/index") e funcionou tambem (se bem que aí ele criou duas rotas iguais, precisaria tratar isso)
Valeu pela ajuda!