Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring application has Cglib2AopProxy warnings

Upon starting my application, I get numerous warnings along the lines of o.s.aop.framework.Cglib2AopProxy 'Unable to proxy method [public final void org.springframework.jdbc.core.support.JdbcDaoSupport.setDataSource(javax.sql.DataSource)] because it is final: All calls to this method via a proxy will be routed directly to the proxy.' for about a dozen or so functions.

Now I perfectly understand that proxy-based aspects cannot be applied to final methods. However, I did not (on purpose, at least) try to weave any aspects into JdbcDaoSupport. I suspect it comes from <tx:annotation-driven />. Is there anything I can do to silence these warnings or, better yet, exclude those classes from the aspect weaving?

like image 540
Michael Piefel Avatar asked Oct 02 '12 12:10

Michael Piefel


4 Answers

This is most likely caused by the @Transactional annotation, Spring wraps your DAO in a proxy to add the transactional behavior.

I would recommend to make your DAO implement an Interface (create and use an interface for your DAO), this will allow Spring to use a JDK dynamic proxy instead of having to use CGLib.

Using CGLIB has a limitation that methods marked as final in target class can’t be advised as final methods can’t be overridden (CGLIB creates a subclass of target class at runtime) but this limitation disappears in case of using JDK dynamic proxies.

Reference

like image 182
Adolfo Avatar answered Nov 13 '22 03:11

Adolfo


Maybe you have extended JdbcDaoSupport and added @Transactional annotations.

You can set the Cglib2AopProxy logger to log level ERROR to avoid the warn messages. For example if using log4j and log4j.properties:

log.logger.org.springframework.aop.framework.Cglib2AopProxy = ERROR
like image 33
Jose Luis Martin Avatar answered Nov 13 '22 02:11

Jose Luis Martin


You should use interfaces for dependency injection, the most reasons for this are described here and here.

You can read documentation about proxying mechanic for details why you see this warning.

And please vote for feature request of inspection for IntelliJ that may helps us to avoid this warnings. BTW It also contains a good explanation.

like image 30
Sergey Ponomarev Avatar answered Nov 13 '22 01:11

Sergey Ponomarev


Spring Boot now uses CGLIB proxying by default, including for the AOP support. If you need interface-based proxy, you’ll need to set the spring.aop.proxy-target-class to false.

spring.aop.proxy-target-class=false

like image 1
Srinivas G Avatar answered Nov 13 '22 02:11

Srinivas G