[jboss-user] [JBoss AOP] - Advice not getting called

pablogmuller do-not-reply at jboss.com
Tue May 13 15:10:25 EDT 2008


Hi, 
I want to extract the Hibernate transaction generation to an aspect, so I did this:

package com.tme.evsp.facade.impl;
  | 
  | import com.tme.evsp.domain.EntidadDO;
  | import com.tme.evsp.facade.EntidadFacade;
  | import com.tme.evsp.facade.TransactionalFacade;
  | import com.tme.evsp.service.EntidadService;
  | 
  | public class EntidadFacadeImpl extends TransactionalFacade implements EntidadFacade {
  | 
  | 	private EntidadService entidadService;
  | 	
  | 	public EntidadFacadeImpl(EntidadService entidadService){
  | 		this.entidadService = entidadService;
  | 	}
  | 	
  | 	public void delete(EntidadDO entidad) throws Exception {
  | 	}
  | 
  | 	public void insertar(EntidadDO entidad) throws Exception {
  | 		try {
  | 			entidadService.insert(entidad);
  | 		} catch (Throwable t) {
  | 			t.printStackTrace();
  | 			throw new RuntimeException(t);
  | 		}
  | 	}
  | ...
  | ...
  | 

With this jboss-aop.xml:


  | <?xml version="1.0" encoding="UTF-8"?>
  | <aop>
  | 
  |    <aspect class="com.tme.evsp.aop.TransactionAspect"/>
  |   
  |    <bind pointcut="execution(* com.tme.evsp.facade.impl.EntidadFacadeImpl->*(..))">
  |      <advice name="transaction" aspect="com.tme.evsp.aop.TransactionAspect"/>
  |    </bind>
  |    
  |     <bind pointcut="execution(* $instanceof{com.tme.evsp.facade.EntidadFacade}->*(..))">
  |      <advice name="transaction" aspect="com.tme.evsp.aop.TransactionAspect"/>
  |    </bind>
  | 
  | 	
  | </aop>

and this is the aspect class

  | package com.tme.evsp.aop;
  | 
  | import org.hibernate.Session;
  | import org.jboss.aop.joinpoint.Invocation;
  | 
  | import com.tme.evsp.util.HibernateUtil;
  | 
  | public class TransactionAspect  {
  | 	
  | 	public void transaction(Invocation invocation) throws Throwable {
  | 		System.out.println("HELLO!!!!");
  | 		Session sesion = HibernateUtil.getSession();
  | 		try {
  | 			sesion.beginTransaction();
  | 			Object o = invocation.invokeNext(); // proceed to next advice or actual call
  | 			sesion.getTransaction().commit();
  | 			
  | 		}catch(Exception e){
  | 			e.printStackTrace();
  | 			sesion.getTransaction().rollback();
  | 			
  | 		}finally {
  | 
  | 		}
  | 	}
  | }


When I build, the class is comiled by apoc:

[aopc] [no comp needed] C:\Documents and Settings\pamuller\My Documents\workspace\telefonica\web\WEB-INF\classes\com\tme\evsp\domain\GrupoFuncionalDO.class
  |      [aopc] [no comp needed] C:\Documents and Settings\pamuller\My Documents\workspace\telefonica\web\WEB-INF\classes\com\tme\evsp\facade\TransactionalFacade.class
  |      [aopc] [compiled] C:\Documents and Settings\pamuller\My Documents\workspace\telefonica\web\WEB-INF\classes\com\tme\evsp\facade\impl\EntidadFacadeImpl.class
  |      [aopc] [no comp needed] C:\Documents and Settings\pamuller\My Documents\workspace\telefonica\web\WEB-INF\classes\com\tme\evsp\facade\TransactionalFacade.class
  |      [aopc] [no comp needed] C:\Documents and Settings\pamuller\My Documents\workspace\telefonica\web\WEB-INF\classes\com\tme\evsp\facade\impl\AdministracionFacadeImpl.class
  |      

but I get the following exception:

insert com.tme.evsp.domain.OperadorDeTelefoniaDO
  | org.hibernate.HibernateException: save is not valid without active transaction
  | 	at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:297)
  | 	at $Proxy4.save(Unknown Source)
  | 	at com.tme.evsp.dao.EntidadDAOImpl.makePersistence(EntidadDAOImpl.java:32)
  | 	at com.tme.evsp.service.impl.OperadorDeTelefoniaServiceImpl.insert(OperadorDeTelefoniaServiceImpl.java:21)
  | 	at com.tme.evsp.facade.impl.EntidadFacadeImpl.com$tme$evsp$facade$impl$EntidadFacadeImpl$insertar$aop(EntidadFacadeImpl.java:21)
  | 	at com.tme.evsp.facade.impl.EntidadFacadeImpl$EntidadFacadeImplAdvisor.insertar_N_6157956559412051353(EntidadFacadeImpl$EntidadFacadeImplAdvisor.java)
  | 	at com.tme.evsp.facade.impl.EntidadFacadeImpl.insertar(EntidadFacadeImpl.java)
  | 	at com.tme.evsp.web.actions.EntidadAction.agregar(EntidadAction.java:46)
  | 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  | 	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  | 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  | 	at java.lang.reflect.Method.invoke(Unknown Source)
  | 	at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:269)
  | 	at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)
  | 	at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
  | 	at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
  | 	at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
  | 	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
  | 	at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
  | 	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
  | 	at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
  | 	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
  | 	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
  | 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
  | 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
  | 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
  | 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
  | 	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
  | 	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
  | 	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
  | 	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
  | 	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
  | 	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
  | 	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
  | 	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
  | 	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
  | 	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
  | 	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
  | 	at java.lang.Thread.run(Unknown Source)

As you can see in the stacktrace, the generated classes are called, but the advice is never executed. 
I've tried every combination for the jboss-aop.xml that I thought it could work, but it didn't.
If someone has any idea of what could be wrong it will be welcome. 

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4150501#4150501

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4150501



More information about the jboss-user mailing list