Hi,

I have implemented an AOP logger in my project using annotations. The @Before and @After aspects are working fine but the @AfterThrowing annotation is not triggering.

Here is my AspectLogging class

Code:
@Aspect
public class LoggingAspect {

	private static final String BEFORE_NO_PARAM = "[ entering <{0}>]";
	private static final String BEFORE_WITH_PARAM = "[ entering <{0}> with params {1} ]";
	private static final String AFTER_THROWING = "[ exception thrown < {0} > exception message {1} with params {2} ]";
	private static final String AFTER_RETURNING = "[ leaving < {0} > returning {1} ]";

	@Resource
	private Logger logger;

	@Before(value = "@annotation(loggable)", argNames = "joinPoint, loggable")
	public void before(JoinPoint joinPoint, Loggable loggable) {

		String pattern;
		if (joinPoint.getArgs().length > 0) {
			pattern = BEFORE_WITH_PARAM;
		} else {
			pattern = BEFORE_NO_PARAM;
		}

		logger.log(loggable.value(), joinPoint.getTarget().getClass(), null,
				pattern, joinPoint.getSignature().getName(),
				getArgumentsAsString(joinPoint.getArgs()));
		logger.hashCode();
	}

	@AfterThrowing(value = "@annotation(com.version1.airtricity.oss.common.aop.Loggable)", throwing = "throwable", argNames = "joinPoint, throwable")
	public void afterThrowing(JoinPoint joinPoint, Throwable throwable) {

		logger.log(LogLevel.ERROR, joinPoint.getTarget().getClass(), throwable,
				AFTER_THROWING, joinPoint.getSignature().getName(),
				throwable.getMessage(),
				getArgumentsAsString(joinPoint.getArgs()));
	}

	@AfterReturning(value = "@annotation(loggable)", returning = "returnValue", argNames = "joinPoint, loggable, returnValue")
	public void afterReturning(JoinPoint joinPoint, Loggable loggable,
			Object returnValue) {

		logger.log(loggable.value(), joinPoint.getTarget().getClass(), null,
				AFTER_RETURNING, joinPoint.getSignature().getName(),
				getArgumentsAsString(returnValue));
	}

	protected String getArgumentAsString(Object object) {
	
	    StringBuffer buffer = new StringBuffer();
	    try {
	
	        new ToStringUtil().generate(object, buffer);
	
	    } catch (Exception e) {
	
	        buffer.append(object.getClass().getName());
	    }
	    return buffer.toString();
	}

	protected String getArgumentsAsString(Object... arguments) {
	
	    StringBuffer buffer = new StringBuffer();
	    for(Object object: arguments)
	        buffer.append("\n").append(getArgumentAsString(object)).append("\n");
	    return buffer.toString();
	}
}
My Loggable Interface

Code:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Loggable {

	LogLevel value();
}
On first inspection the fact that I have the full path to the Loggable interface in the @AfterThrowing annotation might point to an obvious cause but when I remove the full path and reference the interface as @annotation(loggable) as in the other methods, I get the following error:

Code:
6-Apr-2011 11:57:11 org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.http.UserDetailsServiceInjectionBeanPostProcessor#0': Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: com/version1/airtricity/oss/common/aop/loggable (wrong name: com/version1/airtricity/oss/common/aop/Loggable)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)

	at 
................


sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: java.lang.NoClassDefFoundError: com/version1/airtricity/oss/common/aop/loggable (wrong name: com/version1/airtricity/oss/common/aop/Loggable)
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
	at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
	at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1141)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1612)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:247)
	at org.aspectj.weaver.reflect.ReflectionBasedReferenceTypeDelegateFactory.createDelegate(ReflectionBasedReferenceTypeDelegateFactory.java:38)
	at org.aspectj.weaver.reflect.ReflectionWorld.resolveDelegate(ReflectionWorld.java:113)
	at org.aspectj.weaver.World.resolveToReferenceType(World.java:461)
	at org.aspectj.weaver.World.resolve(World.java:305)
	at org.aspectj.weaver.patterns.SimpleScope.lookupType(SimpleScope.java:93)
	at org.aspectj.weaver.BindingScope.lookupType(BindingScope.java:66)
	at org.aspectj.weaver.patterns.ExactAnnotationTypePattern.resolveBindings(ExactAnnotationTypePattern.java:288)
	at org.aspectj.weaver.patterns.AnnotationPointcut.resolveBindings(AnnotationPointcut.java:182)
	at org.aspectj.weaver.patterns.Pointcut.resolve(Pointcut.java:189)
	at org.aspectj.weaver.tools.PointcutParser.resolvePointcutExpression(PointcutParser.java:313)
	at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:294)
	at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:195)
	at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:181)
	at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:162)
	at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:200)
	at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:254)
	at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:286)
	at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:117)
	at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:87)
	at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:68)
	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:359)
	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:322)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:407)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1426)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
	... 25 more
My spring context looks like this

Code:
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:jms="http://www.springframework.org/schema/jms"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
       http://www.springframework.org/schema/jee
       http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
       http://www.springframework.org/schema/jms
       http://www.springframework.org/schema/jms/spring-jms-3.0.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.springframework.org/schema/util
       http://www.springframework.org/schema/util/spring-util-3.0.xsd">

	 <context:annotation-config/>
     <context:component-scan  base-package="com.version1.airtricity.oss.common"/>
	<aop:aspectj-autoproxy />


</beans>
Thanks for any help in advance.

Paul