【问题标题】:com.sun.proxy.$Proxy error on creating pointcut on jdbcTemplate在 jdbcTemplate 上创建切入点时出现 com.sun.proxy.$Proxy 错误
【发布时间】:2014-05-15 10:08:53
【问题描述】:

我尝试做一个切入点,记录 SQL 查询

  @Before("execution(* org.springframework.jdbc.core.JdbcTemplate.*(String, ..))")
public void logSQLQueries() {
        System.out.println("@@");
    }

我正在尝试像这里那样实现代码; http://www.gotoquiz.com/web-coding/programming/java-programming/log-sql-statements-with-parameter-values-filled-in-spring-jdbc/

但我明白了

java.lang.IllegalArgumentException: Can not set org.springframework.jdbc.core.JdbcTemplate field com.xyz.abc.dao.ABCDaoImpl.jdbcTemplate to com.sun.proxy.$Proxy53

我在我的 *-servlet.xml 中创建了 jdbcTemplate bean,并在我所有的 DAO 中自动装配了它。工作得很好,但添加切入点会出现异常。有任何想法吗 ??

【问题讨论】:

  • 程序到接口而不是具体类。 Spring 使用代理来应用 AOP。而不是JdbcTemplate 使用JdbcOperations 后者是接口(你可能也想在你的ointcut 中使用它)。或者从基于接口的代理切换到基于类的代理,或者不使用代理而是使用加载时编织来应用方面。
  • 你指向的例子甚至做了@M.Deinum 刚刚告诉你的,你修改了它!顺便说一句,Spring AOP 也适用于类而不是首选接口,但是您的类路径中需要 CGLIB。
  • 我确实首先尝试了界面,但是当它不起作用时,我尝试了一些不同的东西。我不明白这里代理的概念。你能提供一个我能理解这个概念的参考吗?另外,我如何切换到基于类的代理,或使用加载时间编织。感谢您的回复,请务必给出答案,以便我标记它。
  • @kriegaex 我的类路径中已经有 cglib,请您解释一下它应该如何提供帮助。谢谢
  • 请发布完整的调用堆栈并切换回界面。

标签: spring spring-mvc proxy aspectj spring-aop


【解决方案1】:

Spring 默认使用 JDK 动态代理来应用 AOP。 (有关代理的更多信息,请参阅here)。

发生的情况是创建了一个动态类 (com.sun.proxy.$Proxy53),它实现了目标类实现的所有接口。对于JdbcTemplate,即JdbcOperationsInitializingBean。所以动态类是JdbcOperations,但不是JdbcTemplate,因此注入失败。

你有几个解决方案

  1. 使用接口 JdbcOperations 而不是类 JdbcTemplate 进行编程
  2. 使用基于类的代理
  3. 使用加载时编织

现在选项 1 和 2 是最简单的,而选项 3 是最强大和最复杂的开始(请参阅下面的链接)。

换班中的 1 人

@Autowired
private JdbcTemplate jdbcTemplate;

@Autowired
private JdbcOperations jdbcTemplate; 

如果您正在扩展 JdbcDaoSupport,您可能会陷入困境,然后它将无法正常工作。

选项 2,假设您有 <aop:aspectj-autoproxy />proxy-target-class 属性设置为 true。这将需要 cglib 并将创建基于类的代理而不是基于接口的代理。

对于选项 3,我参考了 the reference guide,因为这涉及(可能)一个 java 代理,并且可能会更复杂一些。

链接

  1. Understanding AOP proxies
  2. Load-time weaving with AspectJ

【讨论】:

  • 谢谢!解决了我的问题。
  • 尝试了前两种解决方案,它们不起作用。至少在 Spring 4.2.x
  • 那么你有一个不同的问题(基本上第一个应该总是工作,如果这不起作用;你有一些如何设法启用(可能)创建代理的代理)。
猜你喜欢
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 2022-08-05
  • 2018-11-18
  • 2016-08-02
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多