Getting Spring Error "Bean named 'x' must be of type [y], but was actually of type [$Proxy]" in Jenkins

27,387

Excerpt from question comments above:

Are you running Cobertura, Sonar or other code-instrumenting tool on Jenkins? Note that mvn site might also be configured to include Cobertura report in generated site.

The problem with Cobertura is that it performs pretty heavy byte-code instrumentation including the addition of some custom interfaces. When Spring starts up it generates proxies for beans. If bean has at least one interface, it uses standard Java proxy. Otherwise it tries to create class-based proxy.

I guess in your case the CGLIB class proxy was used but after Cobertura instrumentation Spring fall back to java proxies. This caused startup error because dependency injection expected class (or CGLIB subclass).

To cut long story short, force CGLIB class proxies and you'll be fine:

<aop:config proxy-target-class="true"/>
Share:
27,387
limc
Author by

limc

Uhm... yea... My Shitty Code Blog My GitHub Page

Updated on November 17, 2020

Comments

  • limc
    limc over 3 years

    I have been debugging this for awhile now, and I'm hoping someone could shed some light here.

    I have a Maven project that is added into Jenkins, using JDK 1.6. I'm using AOP in this project to handle the database transaction.

    When I run the build in Jenkins, my testcase fails with the following exceptions:-

    Caused by: org.springframework.beans.factory.BeanCreationException: 
    Error creating bean with name 'dataHandlerClassificationImpl': 
    Injection of resource dependencies failed; nested exception is 
    org.springframework.beans.factory.BeanNotOfRequiredTypeException: 
    Bean named 'writerDataLocationImpl' must be of type [xxx.script.WriterData], 
    but was actually of type [$Proxy17]
        ...
        ...
    Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: 
    Bean named 'writerDataLocationImpl' must be of type [xxx.script.WriterData], 
    but was actually of type [$Proxy17]
        ...
        ...
    

    The DataHandlerClassificationImpl class looks something like this:-

    @Service
    public class DataHandlerClassificationImpl extends DataHandler {
    
        @Resource(name="writerDataLocationImpl")
        private WriterData writerData;
    
        ...
    }       
    

    WriterData is an interface with multiple implementations.

    I am able to execute the code without problem from the IDE. To determine whether it is a Maven problem or Jenkins problem, I navigated to the Jenkins' project job folder using command line and I'm able to run mvn test without any errors.

    I know the proxy error has something to do with AOP, and that I can only autowire to an interface instead of a concrete class... but that's not the case here since I'm able to run my code fine outside Jenkins.

    Any ideas? Thanks.

  • K. Siva Prasad Reddy
    K. Siva Prasad Reddy almost 12 years
    You are awesome Tomasz :-) Your explanation helped me.
  • Christian Schlichtherle
    Christian Schlichtherle over 7 years
    What's the namespace for aop?
  • Vikky
    Vikky about 6 years
    This property in Spring boot is spring.aop.proxy-target-class=true