Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring com.sun.proxy.$proxy在jdbcTemplate上创建切入点时出错_Spring_Spring Mvc_Proxy_Aspectj_Spring Aop - Fatal编程技术网

Spring com.sun.proxy.$proxy在jdbcTemplate上创建切入点时出错

Spring com.sun.proxy.$proxy在jdbcTemplate上创建切入点时出错,spring,spring-mvc,proxy,aspectj,spring-aop,Spring,Spring Mvc,Proxy,Aspectj,Spring Aop,我试图切入点,记录SQL查询 @Before("execution(* org.springframework.jdbc.core.JdbcTemplate.*(String, ..))") public void logSQLQueries() { System.out.println("@@"); } 我试图实现这里的代码; 但我明白了 java.lang.IllegalArgumentException: Can not set org.springfram

我试图切入点,记录SQL查询

  @Before("execution(* org.springframework.jdbc.core.JdbcTemplate.*(String, ..))")
public void logSQLQueries() {
        System.out.println("@@");
    }
我试图实现这里的代码;

但我明白了

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中创建了JDBCTemplatebean,并在我的所有DAO中自动连接了它。工作非常好,但添加切入点会产生例外。有什么想法吗

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

所发生的事情是创建一个动态类(
com.sun.proxy.$Proxy53
),它实现了目标类实现的所有接口。对于
jdbc模板
,即
jdbc操作
初始化bean
。因此,动态类是一个
jdbc操作
,而不是
jdbc模板
,因此注入失败

你有几个解决办法

  • 使用接口
    jdbc操作
    而不是类
    jdbc模板
    进行编程
  • 使用基于类的代理
  • 使用装载时间编织
  • 现在,选项1和2是最简单的,而选项3是最强大和最复杂的入门方法(参见下面的链接)

    在你的班上换班

    @Autowired
    private JdbcTemplate jdbcTemplate;
    

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

    选项2,假设您有
    ,因为这涉及(可能)一个java代理,并且可能会稍微复杂一些

    链接


  • 编程到接口,而不是具体的类。Spring使用代理应用AOP。不要使用
    jdbc模板
    而使用
    jdbc操作
    ,后者是接口(您可能也希望在您的pointcut中使用)。或者从基于接口的代理切换到基于类的代理,或者不使用代理,而是使用loadtime编织来应用方面。您所指的示例甚至做到了@M.Deinum刚刚告诉您的,您修改了它!顺便说一句,SpringAOP也可以使用类而不是更好的接口,但是你需要在类路径上使用CGLIB。我第一次尝试使用接口,但是当它不起作用时,我尝试了一些不同的方法。我不理解这里代理的概念。你能提供一个我能理解这个概念的参考资料吗。此外,我如何切换到基于类的代理,或使用加载时编织。谢谢你的回复,请务必写一个答案,这样我可以标记它。@kriegaex我的类路径中已经有cglib,你能解释一下它在这里有什么帮助吗。谢谢请发布完整的调用堆栈并切换回接口。谢谢!解决了我的问题。尝试了前两种解决方案,但都不起作用。至少在Spring 4.2.x中,当您遇到一个不同的问题时(基本上第一个问题应该总是有效的,如果它不起作用,那么您有一些方法来启用(可能)创建代理的代理)。
    @Autowired
    private JdbcOperations jdbcTemplate;