Hi all, I'm trying to implement a mechanism to track each user session, at least the login and logout events. The login is easy, because it occurs in a defined place, but the logout can occurs explicitly or because of a timeout, so I thought in advising the Tapestry Session.invalidate() method:
@SuppressWarnings("unchecked") @Advise(serviceInterface=org.apache.tapestry5.services.Session.class) public static void adviseUserActivity(final UserService userService, final MethodAdviceReceiver receiver) throws SecurityException, NoSuchMethodException { MethodAdvice advise = new MethodAdvice() { @Override public void advise(MethodInvocation invocation) { userService.endSession(userService.getCurrentUser().getUserName()); } }; receiver.adviseMethod(receiver.getInterface().getMethod("invalidate"), advise); } But oddly, I'm getting the following error when starting up the application: Caused by: java.lang.RuntimeException: Error invoking method public static void com.app.services.AppModule.adviseUserActivity(com.app.core.services.UserService,org.apache.tapestry5.ioc.MethodAdviceReceiver) throws java.lang.SecurityException,java.lang.NoSuchMethodException: org.hibernate.Session.invalidate() at org.apache.tapestry5.ioc.internal.util.MethodInvoker.invoke(MethodInvoker.java:61) at org.apache.tapestry5.ioc.internal.util.LoggingInvokableWrapper.invoke(LoggingInvokableWrapper.java:42) at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) ... 79 more Caused by: java.lang.NoSuchMethodException: org.hibernate.Session.invalidate() at java.lang.Class.getMethod(Class.java:1622) at com.app.services.AppModule.adviseUserActivity(AppModule.java:198) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at org.apache.tapestry5.ioc.internal.util.MethodInvoker.invoke(MethodInvoker.java:50) ... 81 more 2012-09-23 10:50:11.134::INFO: Started SelectChannelConnector@0.0.0.0:8080 [INFO] Started Jetty Server Why is it trying to advise the org.hibernate.Sesssion.invalidate() method if I explicitly annotated: @Advise(serviceInterface=org.apache.tapestry5.services.Session.class), is it a bug? Anyway, do you think this is the best way of doing this, or is there any other better mechanism to intercept a finished session? Best regards, Matias.