gpt4 book ai didi

spring - 在 jdbcTemplate 上创建切入点时出现 com.sun.proxy.$Proxy 错误

转载 作者:行者123 更新时间:2023-12-02 04:24:40 31 4
gpt4 key购买 nike

我尝试做一个切入点,记录 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 中 Autowiring 了它。工作得很好,但添加切入点却给出了异常(exception)。有任何想法吗 ??

最佳答案

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

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

您有几个解决方案

  1. 使用界面JdbcOperations而不是类 JdbcTemplate编程针对
  2. 使用基于类的代理
  3. 使用加载时编织

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

类(class)中有 1 人发生变化

@Autowired
private JdbcTemplate jdbcTemplate;

@Autowired
private JdbcOperations jdbcTemplate;

如果您要延长JdbcDaoSupport你可能会陷入困境,然后它就不起作用了。

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

对于选项 3,我引用 the reference guide因为这涉及(可能)一个 java 代理,并且工作起来可能会稍微复杂一些。

链接

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

关于spring - 在 jdbcTemplate 上创建切入点时出现 com.sun.proxy.$Proxy 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23675199/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com