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.

Reply via email to