com.sun.proxy.$Proxy error on creating pointcut on jdbcTemplate

aspectj, proxy, spring, spring-aop, spring-mvc

Solution

Spring, by default, uses JDK Dynamic proxies to apply AOP. (For more information on proxies see here).

What happens isthat a dynamic class is created (`com.sun.proxy.$Proxy53`) which implements all the interfaces that the target class implements. For a `JdbcTemplate` that is `JdbcOperations` and `InitializingBean`. So the dynamic class is a `JdbcOperations` but not a `JdbcTemplate` and hence the injection fails.

You have a couple of solutions

- Use the interface `JdbcOperations` instead of the class `JdbcTemplate` to program against

- Use class based proxies

- Use loadtime weaving

Now option 1 and 2 are the easiest whereas option 3 is the most powerful and complex to get started (see the links below).

For 1 in your class change

@Autowired
private JdbcTemplate jdbcTemplate;

To

@Autowired
private JdbcOperations jdbcTemplate; 

If you are extending `JdbcDaoSupport` you might be in a pickle and then it won't work.

Option 2, assuming you have `<aop:aspectj-autoproxy />` set the `proxy-target-class` attribute to `true`. This will require cglib and will create class based proxies instead of interface based proxies.

For option 3 I refer to the reference guide as that involves (probably) a java-agent and might be a little more complicated to get working.

Links

- Understanding AOP proxies

- Load-time weaving with AspectJ

Problem

I try to make a pointcut, to log the SQL queries ``` @Before("execution(* org.springframework.jdbc.core.JdbcTemplate.*(String, ..))") public void logSQLQueries() { System.out.println("@@"); } ``` I am trying to implement the code as here; http://www.gotoquiz.com/web-coding/programming/java-programming/log-sql-statements-with-parameter-values-filled-in-spring-jdbc/ but I get ``` java.lang.IllegalArgumentException: Can not set org.springframework.jdbc.core.JdbcTemplate field com.xyz.abc.dao.ABCDaoImpl.jdbcTemplate to com.sun.proxy.$Proxy53 ``` I have created the jdbcTemplate bean in my *-servlet.xml and have autowired this in all my DAO's. Works perfectly fine but adding the pointcut gives the exception. Any ideas ??

Original source