5
回答
发现一个小问题,可能是Bug
华为云实践训练营,热门技术免费实践!>>>   

@JFinal 你好,想跟你请教个问题:

注册ActiveRecordPlugin时代码如下:

MysqlDataSource mysqlDataSource = new MysqlDataSource();
		mysqlDataSource.setURL("jdbc:mysql://localhost/xx?user=xx&password=xx");
		ActiveRecordPlugin arp = new ActiveRecordPlugin(mysqlDataSource);
		arp.setShowSql(true);

如果Mysql驱动包用3.1.12驱动就没问题,用5.1.17,或者5.1.20都有如下问题:

 

[ERROR]-[Thread: http-8080-2]-[com.jfinal.log.Log4jLogger.error()]: java.lang.ClassCastException: $Proxy0 cannot be cast to java.sql.Connection
com.jfinal.plugin.activerecord.ActiveRecordException: java.lang.ClassCastException: $Proxy0 cannot be cast to java.sql.Connection
	at com.jfinal.plugin.activerecord.Model.find(Model.java:409)
	at com.jfinal.plugin.activerecord.Model.find(Model.java:428)
	at com.zyf.action.NewsController.index(NewsController.java:22)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:53)
	at com.jfinal.core.ActionHandler.handle(ActionHandler.java:72)
	at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:65)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassCastException: $Proxy0 cannot be cast to java.sql.Connection
	at com.jfinal.plugin.activerecord.SqlReporter.getConnection(SqlReporter.java:46)
	at com.jfinal.plugin.activerecord.DbKit.getConnection(DbKit.java:113)
	at com.jfinal.plugin.activerecord.Model.find(Model.java:406)
	... 21 more

举报
幻影浪子
发帖于5年前 5回/554阅
共有5个答案 最后回答: 5年前

解决办法: 

		//return (Connection)Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
		return (Connection)Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{Connection.class}, this);

原因就在于conn.getClass().getInterfaces()方法出来的是Class类数组,此数组的第一个元素必须是Connection才能把创建的代理类转为Connection对象。

参考:

http://www.oschina.net/question/59889_12824

http://blog.csdn.net/njchenyi/article/details/3091092

--- 共有 1 条评论 ---
JFinal原因是:Proxy.newProxyInstance(...) 方法的第二个参数 Class<?>[] interfaces 中的第一个元素类型的实例对象必须要能转化为该方法的返回值类型 Connection 5年前 回复

引用来自“JFinal”的答案

    异常提示是类型转换错误,先试试去掉 SqlReporter 支持: arp.setShowSql(false);
这样是OK的

引用来自“幻影浪子”的答案

引用来自“JFinal”的答案

    异常提示是类型转换错误,先试试去掉 SqlReporter 支持: arp.setShowSql(false);
这样是OK的
    jfinal lib 中使用的就是mysql-connector-java-5.1.20-bin.jar, 没问题的啊,你那是神马情况 

引用来自“JFinal”的答案

引用来自“幻影浪子”的答案

引用来自“JFinal”的答案

    异常提示是类型转换错误,先试试去掉 SqlReporter 支持: arp.setShowSql(false);
这样是OK的
    jfinal lib 中使用的就是mysql-connector-java-5.1.20-bin.jar, 没问题的啊,你那是神马情况 
编译我也没问题啊, 你不要用c3p0连接池,试试看
--- 共有 4 条评论 ---
JFinal回复 @幻影浪子 : 无图无真相 :) 5年前 回复
幻影浪子MysqlDataSource是jdbc驱动里的 5年前 回复
JFinal回复 @幻影浪子 : 你把 MysqlDataSource.java 文件贴出来看看 5年前 回复
幻影浪子我用5.1.20做测试,就是因为你lib里用的是它嘛 5年前 回复
顶部