0

I have written logging mechanism that doesn't work. I use:

  • aspectjrt 1.7.3
  • aspectjweaver 1.7.3
  • spring 3.0.6

I use XML spring definitions for beans. someModuleTarget is a bean that fails to initialize. Some beans in my application are provided to org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator with interceptorNames of different propagations of transactions (REQUIRE, NEW, ETC)

Problem occurs during application deploy but only when I use my new annotation @TimeLog around some methods. Below is some code.

Annotation logging mechanism:

@Aspect
public class TimeLogger {
    @Around("execution(* *(..)) && @annotation(mypackage.TimeLog)")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        Method method = MethodSignature.class.cast(point.getSignature()).getMethod(); 
        //Why this returns TRUE only when I annotate both API and Impl of myAnnotatedComponent?
        method.isAnnotationPresent(LogExecutionTime.class); 
        Object result = point.proceed();
        LOG.info("some info");
        return result;
    }
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TimeLog {
    LogLevels logLevel() default LogLevels.DEBUG;
}

Spring AOP configuration:

<aop:aspectj-autoproxy/>

<bean id="execTimeLogger" class="mypackage2.TimeLogger">
</bean>

This is the exception I get:

org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:352)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:153)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1325)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
    at myPackage.someComponent.afterPropertiesSet(ActionExecutor.java:184)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:283)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:282)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:204)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
    at myPackage.CustomLoaderListener.contextInitialized(ExionContextLoaderListener.java:20)
    at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:775)
    at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:424)
    at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:767)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:249)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:710)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:492)
    at org.mortbay.jetty.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:293)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
    at org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:229)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:172)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
    at org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:229)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
    at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:95)
    at org.eclipse.jetty.server.Server.doStart(Server.java:280)
    at org.mortbay.jetty.plugin.JettyServer.doStart(JettyServer.java:65)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
    at org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:520)
    at org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:365)
    at org.mortbay.jetty.plugin.JettyRunMojo.execute(JettyRunMojo.java:523)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:133)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:108)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:76)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:116)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:361)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:584)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:213)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:157)
    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:606)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)

Caused by: org.springframework.beans.factory.BeanCreationException:
    Error creating bean with name 'someModuleTarget' defined in some.xml
    Initialization of bean failed; nested exception is
        org.springframework.beans.ConversionNotSupportedException:
        Failed to convert property value of type 'com.sun.proxy.$Proxy191 implementing
        mypackage.commons.LocaleConfigurationAware,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised'
        to required type 'mypackage.core.MyAnnotatedComponent' for property 'myAnnotatedComponent';
        nested exception is
            java.lang.IllegalStateException: Cannot convert value of type
            [com.sun.proxy.$Proxy191 implementing mypackage.commons.LocaleConfigurationAware
            org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised]
            to required type [mypackage.core.MyAnnotatedComponent] for property
            'myAnnotatedComponent': no matching editors or conversion strategy found

I post how I inject the annotated component, as request by some comment:

public class MyModuleImpl implements MyModuleApi {
    private MyAnnotatedComponentApi myAnnotatedComponent;
    //I also tried MyAnnotatedComponentImpl myAnnotatedComponent;

    public MyAnnotatedComponentApi getMyAnnotatedComponent() {
        return myAnnotatedComponent;
    }

    public void setMyAnnotatedComponent(MyAnnotatedComponentApi myAnnotatedComponent) {
        this.myAnnotatedComponent = myAnnotatedComponent;
    }
}

Spring beans definition:

<bean id="myModule" class="myPackage.MyModuleImpl" lazy-init="false">
<property name="myAnnotatedComponent" ref="myAnnotatedComponent"/>

<bean id="myAnnotatedComponent" class="myPackage.MyAnnotatedComponentImpl"
michealAtmi
  • 1,012
  • 2
  • 14
  • 36
  • See - http://stackoverflow.com/a/26218549/4290096 – Arun Xavier Jan 18 '16 at 10:04
  • can you also post the code which contains myAnnotatedComponent property – prem kumar Jan 18 '16 at 10:08
  • Ok I read the above link and posted myAnnotatedComponent property above. I have other issue.. It doesnt throw exception after creating interface myAnnotatedComponentAPI. Dont know if its obligatory. It still doesnt work. It works only if I inject myAnnotatedComponentAPI to other component and annote BOTH myAnnotatedComponentAPI methods and myAnnotatedComponentImpl methods. When I annotate only API methods, nothing happens. When I annotate Impl methods, Proxy is created but TimeLogger Aspect ethod.isAnnotationPresent(LogExecutionTime.class) returns FALSE, as it checks API method.. – michealAtmi Jan 18 '16 at 21:03
  • Is your problem solved? Then please close this question or edit it to reflect your new problem. I spent valuable time understanding your problem just to come here and see you're already over it and struggling with another problem. – Nándor Előd Fekete Jan 19 '16 at 01:05
  • No it is not solved, just read my above comment. It only works when I annotate both API and Impl component. Details are in above comment. It should work annotating only method in API or Impl not both, isn't it possible? – michealAtmi Jan 19 '16 at 08:45
  • Guys where are some ideas please ;) – michealAtmi Jan 20 '16 at 18:27

0 Answers0