Vraptor - Acesso ao index.jsp de um caminho

Olá amigos do fórum.

Fui tentar uma coisa aqui no VRaptor e nao tá rolando, por favor me ajudem porque eu devo estar fazendo algo errado! :lol:

Tenho o seguinte controller:

public class CategoriasController {

    public void index(){
    }
}

e tenho o arquivo /WEB-INF/jsp/categorias/index.jsp

Eu imaginei que com a url “/categorias/” o arquivo index.jsp fosse ser encontrado mas isso não está ocorrendo.

Funciona caso eu use “/categorias/index”, ou caso eu anote o metodo com @Path("/categorias")

É que diz na documentação que isso foi um bug corrigido…deveria funcionar, da forma que eu quero? Apenas com “/categorias”?

Obrigado!

o index não tem tratamento especial mesmo… vc precisa anotar o método com @Get("/categorias") pra funcionar mesmo.

Hm…essa nao seria uma convenção bacana de o VRaptor implementar? Ou não? :stuck_out_tongue:

Estou com a documentação da ultima versão e no change log tem esse item:

Bug 109 resolvido: se você tem um arquivo /caminho/index.jsp, você consegue acessá-lo agora via
/caminho/, a menos que exista algum controller que trata essa URI

A correção não trata desse detalhe que eu comentei? Ou, me corrijam se estiver errado, o /caminho/index.jsp será exibido caso não exista controller para esse caminho?

De qualquer forma, valeu Lucas. Já tá funfando aqui. :wink:

talvez seja o caminho de uma jsp fora do web-inf… não as jsps normais dos controllers.

de qqer forma, é mto tarde pra colocar essa convenção agora =(

mas dá pra escrever um interceptorzinho maroto ou sobrescrever o Router pra habilitar essa convenção, não é mto difícil não.

quer tentar?

[quote=Lucas Cavalcanti]talvez seja o caminho de uma jsp fora do web-inf… não as jsps normais dos controllers.

de qqer forma, é mto tarde pra colocar essa convenção agora =(

mas dá pra escrever um interceptorzinho maroto ou sobrescrever o Router pra habilitar essa convenção, não é mto difícil não.

quer tentar?[/quote]

Legal Lucas vou fazer e posto aqui! Valeu!

qqer dúvida dá um toque =)

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!

talvez seja mais fácil vc sobrescrever apenas esse método:

@Override
protected String defaultUriFor(String controllerName, String methodName) {
    if (methodName.equals("index")) 
         return controllerName;
    return super.defaultUriFor(controllerName, methodName);
}

:wink:

[quote=Lucas Cavalcanti]talvez seja mais fácil vc sobrescrever apenas esse método:

@Override
protected String defaultUriFor(String controllerName, String methodName) {
    if (methodName.equals("index")) 
         return controllerName;
    return super.defaultUriFor(controllerName, methodName);
}

;)[/quote]

putz tem razão eu pensei em incluir uma nova rota específica pra isso mas nem é necessário! mas valeu pelo exercício intelectual :lol:

funcionou aqui, valeu lucas!