If you're using AOP, you'll need to tell spring to proxy classes using CGLIB rather than dynamic JDK proxies... To do so, you'll have to add the cglib jars to your project and add the following to your applicationContext.xml ->
<aop:config proxy-target-class="true" /> -Wes On Tue, Aug 18, 2009 at 6:14 AM, <[email protected]> wrote: > Ya, I'm tring Spring AOP as well, and facing some problem. > > If I AOP action class, some action when I run, I got this error, but some is > running fine: > > Struts has detected an unhandled exception: > # Messages: $Proxy18.input1() > File: java/lang/Class.java > Line number: 1,605 > Stacktraces > java.lang.NoSuchMethodException: $Proxy18.input1() > > java.lang.Class.getMethod(Class.java:1605) > > org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.getActionMethod(AnnotationValidationInterceptor.java:75) > > org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:47) > > com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) > > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) > > com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122) > > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) > > com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) > > com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) > > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) > > com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) > > com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) > sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > java.lang.reflect.Method.invoke(Method.java:597) > > org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307) > > org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) > > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) > > com.iss.sandbox.louis.common.utils.LogInterceptor.invoke(LogInterceptor.java:67) > > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) > > org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) > $Proxy17.intercept(Unknown Source) > > > > Not sure what happen, but if I AOP service & dao classes, thats fine, but it > print the interface name instead of the actual implement class name. > Here is part of my spring conf: > > > > <bean > class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> > <property name="beanNames"> > <list> > <value>*Action*</value> > <value>*Service*</value> > <value>*DAO*</value> > </list> > </property> > <property name="interceptorNames"> > <list> > <value>logInterceptor</value> > </list> > </property> > </bean> > > And the LogInterceptor.java: > public class LogInterceptor implements MethodInterceptor { > > private static Log logger = LogFactory.getLog(LogInterceptor.class); > > /* > * (non-Javadoc) > * > * @see > * org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept > * .MethodInvocation) > */ > @Override > public Object invoke(MethodInvocation methodInvocation) throws Throwable { > if (logger.isDebugEnabled()) { > logger.debug("Beginning method: " > + methodInvocation.getMethod().getClass() + "::" > + methodInvocation.getMethod().getName()); > } > try { > Object returnValue = methodInvocation.proceed(); > return returnValue; > } finally { > if (logger.isDebugEnabled()) { > logger.debug("Finish execute " > + methodInvocation.getMethod().getDeclaringClass() > + "::" + methodInvocation.getMethod().getName()); > } > } > } > > } > > > Print out: > > 2009-08-18 11:11:00,296 DEBUG louis.common.utils.LogInterceptor.invoke:62 - > Beginning method: class java.lang.reflect.Method::execute > 2009-08-18 11:11:00,312 DEBUG louis.common.utils.LogInterceptor.invoke:71 - > Finish execute interface com.opensymphony.xwork2.Action::execute > > > > > ________________________________ > From: Dave Newton <[email protected]> > To: Struts Users Mailing List <[email protected]> > Sent: Monday, August 17, 2009 6:01:30 PM > Subject: Re: LoggingInterceptor > > [email protected] wrote: >> We use to have this log statement in most of the method begin and end >> in Struts1, now working with S2+Spring, both are provide logging >> interceptor, so I wonder this can help me to reduce coding in new >> project. > > No; the logging interceptor does exactly what it says it does. > > General declarative entry/exit logging should be handled via AOP, for example > using Spring. > > Dave > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] -- Wes Wannemacher Head Engineer, WanTii, Inc. Need Training? Struts, Spring, Maven, Tomcat... Ask me for a quote! --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]

