[resolvido] - vraptor nÃo redireciona para view

Olá pessoal.

Tou com um erro no meu projeto usando o vraptor.

Eu tenho o seguinte método no meu Controller

	@RestritoDiretor
	@Post
	@Path("/diretor/adiciona")	
	public void adiciona(final Diretor diretor, final Usuario usuario){
		validador.validate(diretor);
		validador.validate(usuario);
		validador.onErrorUsePageOf(IndexController.class).novoDiretor();
		daoDiretor.adiciona(diretor);
		usuario.setTipoUsuario(1);
		usuario.setNome(diretor.getNome());
		daoUsuario.adiciona(usuario);
		usuarioWeb.login(usuario);
		result.redirectTo(this).inicio();
	}

eu já debuguei o código mas ele sempre dá erro quando vai redirecionar para a view do método inicio.

o log do erro é esse:

org.hibernate.TransactionException: Transaction not successfully started
org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:131)
br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:50)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.32 logs.

alguma dica?

ele salva todos os dois objetos no banco sem problema.

O que é aquele usuarioWeb.login(usuario); ?

Pq parece que você chama o método e depois manda redirecionar, mas será que nesse método também não tem redirecionamento.

Posso estar falando bobagem pq nunca mexi com esse framework só li na apostila da caelum, mas pode ser uma ideia … :lol:

não. olha a classe UsuarioWeb.

não tem nenhum redirecionamento.

@Component
@SessionScoped
public class UsuarioWeb {

	private Usuario usuarioLogado;
	
	public void login(Usuario usuario){
		this.usuarioLogado = usuario;
	}
	
	public void logout(){
		this.usuarioLogado = null;
	}
	
	public Boolean isLogado(){
		return this.usuarioLogado != null;
	}
	
	public int getTipoUsuario(){
		return this.usuarioLogado.getTipoUsuario();
	}
	
	public String getNome(){
		return this.usuarioLogado.getNome();
	}
	
}

A ta blz, mas aquele metodo inicio para qual você esta redirecionamento… ele manda para onde ? Pode mostrar o código dele ?

	@RestritoDiretor
	@Get
	@Path("/diretor/inicio")
	public void inicio(){
		
	}

se eu tentar acessar a URL /diretor/inicio

ele mostra tudo direitinho e com o usuário q foi cadastrado já logado.

Felipe, eu lembro ter visto que o construtor da classe deve recer o result, você implementou isso no seu código ?

e se em vez de você fazer result.redirectTo(this).inicio(); você tentar colocar a classe result.redirectTo(NomeDaClasse.class).inicio();

Pode ser um erro do framework, se não isso não vou poder te ajudar muito.

não não era isso…

e sim eu recebo o result no meu construtor.

Desculpe então acho que não vou poder ajudar …

Cara tem como você colocar todos os código que você utiliza nesse fluxo só para dar uma checada geral …

Essas inserções que você está fazendo no BD estão realmente funcionando? Pois pelo início do teu LOG está dando erro no Hibernate, parece que ele não está conseguindo iniciar a transação.

sim se eu for lá no banco elas estao lá…

vc tá controlando transações na mão? tá usando o componente do vraptor que cria as sessions?

tou usando o context-param q já cria a session e o session factory que você me indicou um dia desses (acho q vc não se lembra)

mas vc tá abrindo transação no meio do seu código? se sim, não faça isso, o componente do context-param já faz isso pra vc. O erro é pq tem transação sendo aberta dentro de outra transação

lucas eu faço isso no meu dao.

Transaction tx = sessao.beginTransaction();
sessao.save(t);
tx.commit();

é isso q não tenho q fazer?

exato. tire todo o código de abrir e commitar transação

sessao.save(t);

Pronto Lucas testei e deu certo. tirei esses códigos…

vlws cara… vou marcar como resolvido :smiley: