VRaptor 3 vs Routes

14 respostas
J

Bom pessoal andei lendo aqui alguns topico do GUJ sobre VRaptor 3 e os Routes um dos topico me chamou a atencao http://www.guj.com.br/posts/list/146067.java no entando foi aberto uma issue http://github.com/caelum/vraptor/issues/#issue/160 me parece que foi DEPRECATED esta certo ?

Obrigado !!!
JVDS

14 Respostas

Lucas_Cavalcanti

sim, isso foi deprecado pq fica bem ruim de usar e manter…

um jeito melhor é modificar a convenção que o VRaptor usa para criar as rotas
(estendendo PathAnnotationRoutesParser)

o que vc quer fazer?

J

Lucas Cavalcanti:
sim, isso foi deprecado pq fica bem ruim de usar e manter…

um jeito melhor é modificar a convenção que o VRaptor usa para criar as rotas
(estendendo PathAnnotationRoutesParser)

o que vc quer fazer?

Certo quero definir o seguinte so para vc entender o que estava fazendo quando estava usando Routes

routeFor("/{webLogic}").with(HttpMethod.POST).is(GenericController.class).adiciona(null);
routeFor("/{webLogic}").with(HttpMethod.GET).is(GenericController.class).formulario();

ou seja os form em html vai ter na sua action="/cadpessoa" method=“GET” entao tem que ir para o evento formulario caso seja um POST para adiciona mas isso sabendo que e padrao para qualquer Controller que tem em minha aplicacao.

Obrigado !!!
JVDS

Lucas_Cavalcanti

e pq vc não quer anotar o método?

@Path("/cadpessoa")
public void adiciona(Pessoa pessoa) {

}
J

Lucas Cavalcanti:
e pq vc não quer anotar o método?

@Path("/cadpessoa")
public void adiciona(Pessoa pessoa) {

}

Entao lucas e que estou trabalhando com controller Generic nao queria sair anotando metodo de cada classe ate dei dando uma olhada no codigo fonte do vraptor mais ainda nao achei uma solucao se puder implementar isso seria legal a classe que estava olhando onde que faz toda esta parafernalhia e a RouteBuilder.java ?

o codigo que achei foi esse.

this.strategy = new FixedMethodStrategy(originalUri, type, method, this.supportedMethods, builder.build(),priority);

O que achei meio estranho a variavel "originaUri serve tando para Origem e Destino e isso mesmo e de uma olhada neste codigo que imprimi no console que vraptor monta as URI por isso cheguei a conclusao desta variavel.

String.format("<< Route: %s %s=> %s >>", originalUri, supportedMethods, this.strategy.toString());
Lucas_Cavalcanti

bom, vc não vai implementar isso com o RoutesConfiguration, pq não vai funcionar…

o que vc quer fazer? como vc vai decidir os caminhos dos métodos dos GenericController (na classe filha)?

J

Lucas Cavalcanti:
bom, vc não vai implementar isso com o RoutesConfiguration, pq não vai funcionar…

o que vc quer fazer? como vc vai decidir os caminhos dos métodos dos GenericController (na classe filha)?

quero fazer o seguinte tudo que for classeX Tipo
classeX HttpMethod.GET => formulario
classeX HttpMethod.POST => adiciona

ou seja na hora do vraptor montar os routes fazer isso
lembrando que for HttpMethod.GET = montar para formulario HttpMethod.POST = adiciona seria parecido com ruby on rails se nao me engano.

/cadpessoa => /cadpessoa/formulario
/cadpessoa => /cadpessoa/adiciona
/caduf => /caduf/formulario
/caduf => /caduf/adiciona

OK

Obrigado !!!
JVDS

Lucas_Cavalcanti

seu controller vai se chamar PessoaController, por exemplo?

se sim, vc pode criar a classe:

@Component
@ApplicationScoped
public class CustomRoutesParser extends PathAnnotationRoutesParser {
    //construtor delegado

    @Override
    protected String defaultUriFor(String controllerName, String methodName) {
		if (methodName.equals("adiciona") || methodName.equals("formulario")) {
                    return "cad" + controllerName
                } else {
                    return super.defaultUriFor(controllerName, methodName
                }
	}


}

e no GenericController vc anota o formulario com @Get e o adiciona com @Post

se tiver mais regras é só colocar nessa classe… e vc ainda pode sobrescrever os outros métodos protected dela…

J

Lucas Cavalcanti:
seu controller vai se chamar PessoaController, por exemplo?

se sim, vc pode criar a classe:

@Component
@ApplicationScoped
public class CustomRoutesParser extends PathAnnotationRoutesParser {
    //construtor delegado

    @Override
    protected String defaultUriFor(String controllerName, String methodName) {
		if (methodName.equals("adiciona") || methodName.equals("formulario")) {
                    return "cad" + controllerName
                } else {
                    return super.defaultUriFor(controllerName, methodName
                }
	}


}

e no GenericController vc anota o formulario com @Get e o adiciona com @Post

se tiver mais regras é só colocar nessa classe… e vc ainda pode sobrescrever os outros métodos protected dela…

fiz conforme vc me falou estou recebendo esta exception:

java.lang.IllegalStateException: There are two rules that matches the uri '/caddepartamento' with method GET: [[FixedMethodStrategy: /caddepartamento                                                  CadDepartamentoController.adiciona(CadDepartamento)                    ALL], [FixedMethodStrategy: /caddepartamento                                                  CadDepartamentoController.formulario()                                 ALL]] with same priority. Consider using @Path priority attribute.
	at br.com.caelum.vraptor.http.route.DefaultRouter.checkIfThereIsAnotherRoute(DefaultRouter.java:106)
	at br.com.caelum.vraptor.http.route.DefaultRouter.parse(DefaultRouter.java:97)
	at br.com.caelum.vraptor.http.DefaultResourceTranslator.translate(DefaultResourceTranslator.java:51)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:64)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:637)
Lucas_Cavalcanti

vc anotou os métodos adiciona e formulario do GenericController com @Post e @Get?

J

sim e do DepartamentoController nao.

Lucas_Cavalcanti

mas vc sobrescreveu esses métodos no DepartamentoController?

J

nao depois sim so para ver e da a mesma exception

Lucas_Cavalcanti

habilita o log de debug e posta aqui o que aparece assim que vc inicia o servidor, plz

testei aqui rapidamente, e colocar os @Get e @Post na classe mãe funcionou pra filha tb…

J

Lucas Cavalcanti:
habilita o log de debug e posta aqui o que aparece assim que vc inicia o servidor, plz

testei aqui rapidamente, e colocar os @Get e @Post na classe mãe funcionou pra filha tb…

Achei o problema aqui na minha aplicacao e o seguinte o que estava acontecendo era isto como estou usando GenericController se eu nao fizer @Override no metodo adciona do controller meu por exemplo do CadDepartamentoController ele sobe com CadDeparamentoController.adiciona(Object) entao faco o @Override ai ele sobe com CadDeparamentoController.adiciona(CadDepartamento) so que nao estava colocando a anotacao @Post so estava la no GenericController @Post no metodo adiciona entao esta subindo assim

Jul 30, 2010 9:20:18 AM br.com.caelum.vraptor.http.route.RouteBuilder is
INFO: /caddepartamento                                  [ALL] -> CadDepartamentoController.adiciona(CadDepartamento)
Jul 30, 2010 9:20:18 AM br.com.caelum.vraptor.http.route.RouteBuilder is
INFO: /caddepartamento                                  [GET] -> GenericController.formulario()

Devido ao [ALL] -> CadDepartamentoController.adiciona(CadDepartamento) ele estava dando aquele exception sempre tentava ir para aquele metodo
entao sobrescrevi os seguinte metodos da classe PathAnnotationRoutesParser e resolveu se tiver outra forma de resolver sem ter que sair anotando classe por classe posta ai valeu

@Override
	protected String defaultUriFor(String controllerName, String methodName) {
		// TODO Auto-generated method stub
		if ((methodName.equals("adiciona")) || (methodName.equals("deletar")) || (methodName.equals("formulario"))) {
			return controllerName.toLowerCase();
		} else {
			return super.defaultUriFor(controllerName, methodName).toLowerCase();
		}
	}
	
	@Override
	protected List<Route> registerRulesFor(Class<?> baseType) {
		// TODO Auto-generated method stub
		List<Route> routes = new ArrayList<Route>();
		for (Method javaMethod : baseType.getMethods()) {
			if (isEligible(javaMethod)) {
				String[] uris = getURIsFor(javaMethod, baseType);
				for (String uri : uris) {
					RouteBuilder rule = new RouteBuilder(this.proxifier, this.finder, uri);
					for (HttpMethod m : HttpMethod.values()) {
						if (javaMethod.isAnnotationPresent(m.getAnnotation())) {
							rule.with(m);
						}
					}
					if (javaMethod.isAnnotationPresent(Path.class)) {
						rule.withPriority(javaMethod.getAnnotation(Path.class).priority());
					}
					if (javaMethod.getName().toLowerCase().equals("adiciona")) {
						rule.with(HttpMethod.POST);
					}
					if (javaMethod.getName().toLowerCase().equals("deletar")) {
						rule.with(HttpMethod.DELETE);
					}
					rule.is(baseType, javaMethod);
					rule.build();
					routes.add(rule.build());
				}
			}
		}
		return routes;		
	}

Obrigado !!!
JVDS

Criado 29 de julho de 2010
Ultima resposta 30 de jul. de 2010
Respostas 14
Participantes 2