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
My Loggable InterfaceCode:@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(); } }
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:@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Loggable { LogLevel value(); }
My spring context looks like thisCode: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
Thanks for any help in advance.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>
Paul


Reply With Quote