RoutesConfiguration - Problema ou fiz algo errado?

7 respostas
G

Oi pessoal…

Ao criar rotas genéricas para acessar ao meu recurso … tenho um problema … eu não consiguo criar a rota sem passar os parametros

webMethod e webLogic

public void config(Router router) {

		new Rules(router) {
			public void routes() {
			           routeFor("/groupware-workbench/test/{idToolInstance}/userMgr").is(type("br.eg.collabcomponent.coord.userMgr.api.UserMgrController"), method("list"));
			}
		};

	}

O problema fica no método matches… da classe PatternBasedStrategy os parametros no meu (“webLogic”) e (“webMethod”) caso são null e o metodo apply não faz validação, somente substitue o valor .

É assi mesmo ou precisso criar meu proprio método matches() … se é assi onde devo criar ele ?

public ResourceMethod matches(String uri, HttpMethod method, MutableRequest request) {
		if(canHandle(uri, method)){
			control.fillIntoRequest(uri, request);
			String webLogic = request.getParameter("webLogic");
			String webMethod = request.getParameter("webMethod");
			String typeName = type.apply("webLogic",webLogic);
			try {
				DefaultResourceClass resource = new DefaultResourceClass(Class.forName(typeName));
				Method resourceMethod = method(resource.getType(), this.method.apply("webMethod", webMethod));
				return new DefaultResourceMethod(resource, resourceMethod);
			} catch (ClassNotFoundException e) {
				logger.debug("Unable to find type " + typeName + " for strategy " + this);
				return null;
			}
		}
		return null;
	}

{webLogic}/{webMethod}

7 Respostas

Lucas_Cavalcanti

Olá,

porque você não está fazendo:

@Resource
public class UserMgrController {
    @Path("/groupware-workbench/test/{idToolInstance}/userMgr")
    public void list(){...}
}

É um jeito bem mais fácil de manter a aplicação depois…

Se você prefere fazer isso no RoutesConfiguration, use a classe para criar a rota:

routeFor("/groupware-workbench/test/{idToolInstance}/userMgr").is(UserMgrController.class).list();

o erro provavelmente é: se /groupware-workbench é seu context-path, ele não deve fazer parte da sua rota…

[]'s

G

Oi lucass …
O metodo que realmente desejo implementar é o seguente:
sendo que a variavel uri em cada iteração é:

“/groupware-workbench/test/{idToolInstance}/userMgr”
"/groupware-workbench/test/{idToolInstance}/roleMgr"
"/groupware-workbench/test/{idToolInstance}/toolMgr"

"/groupware-workbench/test/{idToolInstance}/testMgr"

public void config(Router router) {

		new Rules(router) {
			public void routes() {

				for(br.eg.groupwareComponentFwFw.facade.Component component :  GroupwareRoutes.this.components) {
					CollabComponent collabComponent = (CollabComponent) component;

					String uri = collabComponent.getConfigurationURL().replaceAll("\\$", "");
					String controllerClass = collabComponent.getComponentInstanceClass().replaceAll("Instance", "Controller");

					routeFor(uri).is(type(controllerClass), method("list"));
					routeFor(uri+"/{id}").is(type(controllerClass), method("retrieve"));

				}
			}
		};

	}

P.D= disculpe se quiz simplificar o meu problema

Lucas_Cavalcanti

tudo bem fazer assim, mas qual URI vc tá chamando no browser?
algo como:

http://localhost:8080/groupware-workbench/test/1234/userMgr

??

se for, você tem que tirar o /groupware-workbench do começo das suas rotas, pois ele é o context-path, e ele não deve fazer parte das rotas

G

Oi lucas

As chamadas são :

http://localhost:8080/teste-vraptor3/groupware-workbench/test/12/userMgr
http://localhost:8080/teste-vraptor3/groupware-workbench/test/123/roleMgr

e dá o erro seguente:

SEVERE: Servlet.service() for servlet default threw exception
java.lang.NullPointerException
	at java.lang.String.replace(String.java:2219)
	at br.com.caelum.vraptor.http.route.PatternBasedType.apply(PatternBasedType.java:80)
	at br.com.caelum.vraptor.http.route.PatternBasedStrategy.matches(PatternBasedStrategy.java:77)
	at br.com.caelum.vraptor.http.route.DefaultRouter.parse(DefaultRouter.java:113)
	at br.com.caelum.vraptor.http.DefaultResourceTranslator.translate(DefaultResourceTranslator.java:65)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:64)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:71)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:99)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:39)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:97)

O problema e que na URI eu precisso mandar {webLogic} e {webMethod} … para que o parametro Value no método PatternBasedType.apply não seja null

Lucas_Cavalcanti

é… pra usar desse jeito você precisaria usar o {webLogic} e {webMethod} dentro das strings…

de qualquer forma você pode fazer o seguinte:

String controllerClassName = ...;
Class<?> controllerClass = Class.forName(controllerClassName);
Method listMethod = controllerClass.getDeclaredMethod("list");
routeFor("....").is(controllerClass, listMethod);

ou algo parecido com isso…

esse código pode soltar várias exceções, mas você pode usar essa biblioteca que já é dependencia do vraptor pra deixar mais fácil:
http://projetos.vidageek.net/mirror-pt/

entendeu a idéia, ou quer que eu explique melhor?

G

Obrigado …lucas

no final ficou muito melhor com Mirror :smiley:

public void config(Router router) {

		new Rules(router) {
			public void routes() {

				for(br.eg.groupwareComponentFwFw.facade.Component component :  GroupwareRoutes.this.components) {
					//CollabComponent component ;
					CollabComponent collabComponent = (CollabComponent) component;

					String uri = collabComponent.getConfigurationURL().replaceAll("\\$", "");
					String controllerClassName = collabComponent.getComponentInstanceClass().replaceAll("Instance", "Controller");
 
					Class<?> targetClass = new Mirror().reflectClass(controllerClassName);
					Method method = new Mirror().on(controllerClassName).reflect().method("list").withArgs(String.class);
					routeFor(uri).with(HttpMethod.GET).is(targetClass, method);
				}
				
			}
		};

	}
Lucas_Cavalcanti

=)
muito bom

Criado 16 de outubro de 2009
Ultima resposta 16 de out. de 2009
Respostas 7
Participantes 2