vRaptor - erro 500: Could not invoke method delete [RESOLVIDO]

2 respostas
tefo

Eai galera,

eu faço a seguinte requisiçao para deletar um usuario:
<form id="usuarioDeleteForm" action="<c:url value="/${usuarioWeb.login}/removerUsuario"/>" method="POST">
	<fieldset>
		<legend>Remover Usuario</legend>
		
		<p>
			&lt;label for="atual"&gt;Senha atual:&lt;/label&gt;
			&lt;input id="atual" type="password" name="usuario.password"/&gt;
			<br  /><br />
		</p> 
		
		&lt;blockquote class="small"&gt;
			<p>
				Aviso de deleçao!
			</p>
		&lt;/blockquote&gt;
		
		&lt;input type="hidden" name="usuario.versao" value="${usuario.versao}" /&gt;
		&lt;input type="hidden" name="idCripto" value="${usuarioWeb.id}"/&gt;
		&lt;input type="hidden" name="_method" value="DELETE"/&gt;
		&lt;input id="deletar" type="submit" value="Remover"/&gt;
	&lt;/fieldset&gt;
&lt;/form&gt;
e este eh o metodo em UsuarioController para remover o usuario:
@Restrito
	@Delete @Path("/{usuario.login}/removerUsuario")
	public void remover(Usuario usuario, String idCripto) {
		Long id = null;
		try{
			id = Long.parseLong(DecryptData.decryptData(idCripto, CreateAndSaveAESKey.AES_SECRET_KEY_FOR_ID));
		}catch (Exception e) {
			System.out.println(" Erro: " + e.getMessage());
		}
		
		Usuario recuperado = usuDao.consultar(id);
		String senhaCripto = recuperado.getPassword();
		
		String password = "";
		try{
			password = DecryptData.decryptData(recuperado.getPassword(), CreateAndSaveAESKey.AES_SECRET_KEY_FOR_PASSWORD);
		}catch (Exception e) {
			System.out.println(" Erro: " + e.getMessage());
		}
		
		if(password.equals(usuario.getPassword())){
			usuario.setId(id);
			usuario.setPassword(senhaCripto);
			usuario.setPessoa(recuperado.getPessoa());
			
			validaUsuario(usuario, idCripto);
			usuDao.remover(usuario); 
		}else{
			validator.add(new ValidationMessage("Senha atual inv&aacute;lida para deletar sua conta!", "usuario.login"));
		}
		validator.onErrorUsePageOf(UsuarioController.class).editar(recuperado.getLogin(), idCripto);
		result.redirectTo(this).loginForm();
	}
este eh o metodo para remoçao do usuario no Dao:
@Transactional
	public void remover(Usuario usuario) {
		this.session.delete(usuario);
	}
e este eh o erro que acontece:
09/08/2012 16:36:37 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet default threw exception
br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method delete
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:87)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	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.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	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:859)
	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:680)
Caused by: net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method delete
	at net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:45)
	at net.vidageek.mirror.invoke.MethodHandlerByMethod.withArgs(MethodHandlerByMethod.java:54)
	at br.com.website.infra.CriadorDeSession$1.intercept(CriadorDeSession.java:37)
	at br.com.website.infra.CriadorDeSession$1.intercept(CriadorDeSession.java:1)
	at br.com.caelum.vraptor.proxy.CglibProxifier$2.intercept(CglibProxifier.java:95)
	at org.hibernate.Session$$EnhancerByCGLIB$$ba2012fa.delete(&lt;generated&gt;)
	at br.com.website.dao.UsuarioDaoImpl.remover(UsuarioDaoImpl.java:87)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	at $Proxy51.remover(Unknown Source)
	at br.com.website.controller.UsuarioController.remover(UsuarioController.java:278)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	... 43 more
Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [br.com.website.bean.Usuario#2]
	at org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:638)
	at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:120)
	at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:73)
	at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:956)
	at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:934)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:38)
	... 66 more

um erro identico acontecia comigo quando eu tentava atualizar um usuario.. mas troquei o metodo de persistencia de update para merge e funcionou.. agora para remover/deletar um objeto nao sei o que fazer..

Alguem tem alguma dica?

2 Respostas

Lucas_Cavalcanti

vc carregou o usuário com o id aqui:

Usuario recuperado = usuDao.consultar(id);

e na hora de remover, usou o usuário que veio do parâmetro:

usuDao.remover(usuario);

ou seja, dois usuários (objetos) com o mesmo id passados pra mesma session, e isso não é permitido no hibernate…

vc precisa remover o cara que veio do banco:

usuDao.remover(recuperado);
tefo

hum… nao sabia disso…

funcionou do jeito que vc disse!

Muito obrigado Lucas!

Criado 9 de agosto de 2012
Ultima resposta 10 de ago. de 2012
Respostas 2
Participantes 2