Integrando JSF e VRaptor

17 respostas
paulojribp

Caros, boa noite.

Estou fazendo uma loucura (gambiarra) no meu sistema. Estou colocando ao mesmo tempo JSF (já tinha, ou seja, legado) e VRaptor (novas funcionalidades e futura migração). Eu configurei o vraptor da seguinte forma:

<filter> <filter-name>vraptor</filter-name> <filter-class>br.com.caelum.vraptor.VRaptor</filter-class> </filter> <filter-mapping> <filter-name>vraptor</filter-name> <url-pattern>/vr/*</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping>

E o JSF para atender as requisições *.jsf.

Coloquei todas as libs do VRaptor de acordo com o blank-project porém ao tentar executar da o seguinte erro:

Sei que é erro de mapeamento, tenho um controller como a seguir:

@Resource
public class IndexController {

	public IndexController() {
		
	}
	
	//  tentei /vr/index e  /vr e nada
	@Path("/index")
	public void index(){
		
	}
	
	@Path("/error")
	public void error(){
	}
	
	public void blank() {
		
	}
}

E no WEB-INF está: jsp/index/index.jsp

Já tentei jsp/vr/index/index.jsp e não deu certo.

Alguém tem alguma idéia?

PS: A parte “legada” JSF está funcionando corretamente.

17 Respostas

G

Não faça isso, não vai funcionar.

Mapeie o VRaptor para /*, e então coloquei um componente como este aqui: https://github.com/caelum/vraptor/blob/master/vraptor-plugin-gae/src/br/com/caelum/vraptor/gae/AppEngineStaticContentHandler.java

E altere isso:

Por isto:

Lucas_Cavalcanti

pro filtro funcionar com o url mapping vc precisa sobrescrever um dos componentes do VRaptor:

@Component
@ApplicationScoped
public class MeuRoutesParser extends PathAnnotationRoutesParser {

  //gera o construtor

 //sobrescreve o fixURLs, acrescentando /vr no começo de todas
}
paulojribp

Lucas, valeu a dica, mas ainda não deu certo. Fiz o seguinte:

@Component
@ApplicationScoped
public class SmrcRoutesParse extends PathAnnotationRoutesParser {

	public SmrcRoutesParse(Router router) {
		super(router);
	}

	@Override
	protected void fixURIs(Class<?> arg0, String[] arg1) {
		for (int x=0; x<arg1.length; x++) {
			arg1[x] = "/vr" + arg1[x];
		}
		
		for (String s : arg1) {
			System.out.println(s);
		}
		
		super.fixURIs(arg0, arg1);
	}
	
}

E no console imprime correto: /vr/index; mas não encontra e continua dando nullPointer postado acima.

Outra coisa, dentro de jsp, eu deixo: vr/index/index.jsp ou apenas index/index.jsp?

Entendo que o Routes Parse serve apenas para rotear as urls e não mudaria nada no local físico dos arquivos. Correto?

@garcia-jj queria testar uma solução menos intrusiva como a o Lucas, se não der certo vou para a sua solução.

Lucas_Cavalcanti

sim, vc não precisa mudar nada na convenção dos jsps

você fez alguma outra customização do VRaptor?
o nullpointer está dando no requestInfo que nunca deveria ser null…

vc tá com a última versão do VRaptor?

paulojribp

Sim, ultima versão. vraptor 3.4.0

Não mudei mais nada no VRaptor, nem criei quaisquer outra customização.

Bom, outro detalhe é que já tenho spring configurado no projeto, talvez esteja dando conflito, pois o projeto já usava spring. Bom, pode ser algo do tipo.

R

Tem certeza que vc quer fazer isso mesmo?? :smiley: :smiley: :smiley:

paulojribp

Bom, querer eu quero… se dá é outra coisa. No entanto, não entendo porque ainda não funcionou, pois não existem restrições… JSF atende a requisições .jsf e vraptor atende as requisições /vr/

Vou tentar o modelo sugerido pelo @garcia-jj

Qualquer novidade no modelo de vocês que poderem me ajudar eu agradeço.

Abraço.

paulojribp

Ok, também não deu certo e aparece o mesmo erro. O que me leva a crer que não é erro de configuração do VRaptor em si mas de alguma configuracão spring. Bom, vou criar um projeto limpo com jsf e vraptor sem as configurações que tenho atualmente no Spring e ver no que dá.

Valeu.

Lucas_Cavalcanti

o xml do spring está no classpath com o nome applicationContext.xml? ou pelo menos está configurado no ContextLoaderListener no web.xml?

paulojribp

Sim está. Na seguinte forma:

<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/applicationContext*.xml</param-value>
	</context-param>

E no application, eu tenho o applicationContext.xml para as configurações e applicationContext-beans.xml para os beans gerais da app.

Lucas_Cavalcanti

mas tá com o listener registrado, neh?

o VRaptor deveria funcionar com isso normalmente… habilite o log de debug do vraptor e veja o que aparece na inicialização do sistema… deve falar algo sobre usar o applicationContext que já existe

paulojribp

Só para esclarecer, qual listener você está falando?

Lucas_Cavalcanti

o ContextLoaderListener do Spring

paulojribp

Sim, ele e o ContextLoaderListener.

Vou colocar o log do VRaptor em debug para ver se aparece alguma coisa mais palpável.

Valeu.

---- editando ----
Quis dizer, ele e o RequestContextListener.

Lucas_Cavalcanti

tire o request context listener… o vraptor já faz esse trabalho… se vc registra ele sobrescreve o que o vraptor faz

paulojribp

Lucas… era apenas isso. Caramba, não acredito.

A parte da conf com JSF acho que resolveu, mas ainda tem um probleminha.

O que contece é o seguinte, naquele esquema que você me passou para mapear o /vr/* ficou legal, ele apenas não mapeia automaticamente, sem o @Path no metodo. Veja o log:

21:22:49,024  INFO [DefaultRouteBuilder ] /vr/error                                         [ALL] -> IndexController.error()

/vr/

21:22:49,025  INFO [DefaultRouteBuilder ] /vr/                                              [ALL] -> IndexController.index()

21:22:49,026  INFO [DefaultRouteBuilder ] /index/blank                                      [ALL] -> IndexController.blank()

A classe:

@Resource
public class IndexController {

	public IndexController() {
		
	}
	
	@Path("/")
	public void index(){
		
	}
	
	@Path("/error")
	public void error(){
	}
	
	public void blank() {
		
	}
}

O blank era pra ser mapeado com /vr/index/blank mas não foi. Alguma solução visível?

Abraço.

— editando

Colocando o post como resolved. Pois ele realmente está resolved. Qualquer outra dúvida ou problema é outro assunto. Obrigado.

Lucas_Cavalcanti

pra mapear mesmo sem o @Path vc precisa sobrescrever outro método, talvez o método principal da interface ao invés do fixURIs

Criado 21 de março de 2012
Ultima resposta 23 de mar. de 2012
Respostas 17
Participantes 4