java.lang.AbstractMethodError:org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.setCharacterStream(DelegatingPreparedStatement.java:328)
我有一个非常讨厌的问题,我似乎在任何地方都找不到答案 我的应用程序在尝试持久化@Lob时引发此异常:java.lang.AbstractMethodError:org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.setCharacterStream(DelegatingPreparedStatement.java:328),java,mysql,hibernate,tomcat,jdbc,Java,Mysql,Hibernate,Tomcat,Jdbc,我有一个非常讨厌的问题,我似乎在任何地方都找不到答案 我的应用程序在尝试持久化@Lob时引发此异常: java.lang.AbstractMethodError at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.setCharacterStream(DelegatingPreparedStatement.java:328) at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedSt
java.lang.AbstractMethodError
at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.setCharacterStream(DelegatingPreparedStatement.java:328)
at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.setCharacterStream(DelegatingPreparedStatement.java:328)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
at $Proxy32.setCharacterStream(Unknown Source)
at org.hibernate.type.descriptor.sql.ClobTypeDescriptor$3$1.doBind(ClobTypeDescriptor.java:83)
at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:92)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:280)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:275)
at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:57)
at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2747)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3152)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3087)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3416)
at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:140)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:276)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1213)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:402)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
...(more)
我正在运行Tomcat6.0.36(也尝试了Tomcat7)
MySQL 4.1.22数据库
代码使用jdk 7编译,并使用gradle构建
我的依赖项是:
+--- javax.mail:mail:1.4 -> 1.4.1
| \--- javax.activation:activation:1.1
+--- org.slf4j:slf4j-api:1.5.6 -> 1.6.1
+--- log4j:log4j:1.2.13 -> 1.2.16
+--- org.apache.wicket:wicket:1.4.15
| \--- org.slf4j:slf4j-api:1.5.8 -> 1.6.1
+--- org.apache.wicket:wicket-extensions:1.4.15
| +--- org.apache.wicket:wicket:1.4.15 (*)
| \--- org.slf4j:slf4j-api:1.5.8 -> 1.6.1
+--- mysql:mysql-connector-java:5.1.26
+--- com.microsoft.sqlserver:sqljdbc4:4.0
+--- com.itextpdf:itextpdf:5.4.2
+--- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.0.Final -> 1.0.1.Final
+--- org.hibernate:hibernate-core:4.1.9.Final
| +--- antlr:antlr:2.7.7
| +--- org.jboss.logging:jboss-logging:3.1.0.GA
| +--- org.javassist:javassist:3.17.1-GA
| +--- org.jboss.spec.javax.transaction:jboss-transaction-api_1.1_spec:1.0.0.Final
| +--- dom4j:dom4j:1.6.1
| | \--- xml-apis:xml-apis:1.0.b2
| +--- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final
| \--- org.hibernate.common:hibernate-commons-annotations:4.0.1.Final
| \--- org.jboss.logging:jboss-logging:3.1.0.CR2 -> 3.1.0.GA
+--- org.hibernate:hibernate-entitymanager:4.1.9.Final
| +--- org.jboss.logging:jboss-logging:3.1.0.GA
| +--- org.javassist:javassist:3.17.1-GA
| +--- org.jboss.spec.javax.transaction:jboss-transaction-api_1.1_spec:1.0.0.Final
| +--- dom4j:dom4j:1.6.1 (*)
| +--- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final
| +--- org.hibernate:hibernate-core:4.1.9.Final (*)
| \--- org.hibernate.common:hibernate-commons-annotations:4.0.1.Final (*)
+--- foo.bar.data-services:foor-bar-data:2.0.0.275
| +--- org.slf4j:slf4j-api:1.6.1
| +--- org.hibernate:hibernate-core:4.1.6.Final -> 4.1.9.Final (*)
| +--- org.hibernate.javax.persistence:hibernate-jpa-2.0-api::1.0.1.Final -> 1.0.1.Final
| +--- org.slf4j:slf4j-log4j12:1.6.1
| | +--- org.slf4j:slf4j-api:1.6.1
| | \--- log4j:log4j:1.2.16
| +--- log4j:log4j:1.2.16
| \--- commons-configuration:commons-configuration:1.9
| +--- commons-lang:commons-lang:2.6
| \--- commons-logging:commons-logging:1.1.1
+--- javax.transaction:jta:1.1
+--- dom4j:dom4j:1.6.1 (*)
+--- antlr:antlr:2.7.6 -> 2.7.7
+--- commons-collections:commons-collections:3.2.1
+--- commons-configuration:commons-configuration:1.9 (*)
+--- commons-dbcp:commons-dbcp:1.4
| \--- commons-pool:commons-pool:1.5.4 -> 1.5.7
+--- commons-pool:commons-pool:1.5.7
+--- commons-logging:commons-logging:1.1.1
+--- commons-dbutils:commons-dbutils:1.4
+--- commons-lang:commons-lang:2.6
+--- commons-io:commons-io:2.4
+--- org.apache.commons:commons-email:1.2
| +--- javax.mail:mail:1.4.1 (*)
| \--- javax.activation:activation:1.1
+--- javax.servlet:servlet-api:2.5
+--- javax.servlet.jsp:jsp-api:2.1
\--- org.slf4j:slf4j-log4j12:1.5.6 -> 1.6.1 (*)
因此,看看这个异常,应用程序似乎试图调用CATALINA_BASE/lib文件夹中的tomcat-dbcp.jar。但我希望它在我的类路径中调用我的commons-dbcp.jar
但坦率地说,我不知所措,我尝试了很多东西,但似乎无法让它工作。。。
提前感谢你的帮助。如果需要更多信息,请告诉我
编辑1:
server.xml
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/>
<Listener className="org.apache.catalina.core.JasperListener"/>
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<GlobalNamingResources>
<Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" logAbandoned="true" maxActive="100" maxIdle="10" maxWait="10000" name="jdbc/foo" removeAbandoned="true" removeAbandonedTimeout="300" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/foo?autoReconnect=true&dumpQueriesOnException=true" username="root" validationQuery="select 1"/>
<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" logAbandoned="true" maxActive="20" maxIdle="5" maxWait="10000" name="jdbc/bar" removeAbandoned="true" removeAbandonedTimeout="300" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/bar?autoReconnect=true&dumpQueriesOnException=true" username="root" validationQuery="select 1"/>
</GlobalNamingResources>
<Service name="Catalina">
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
<Engine defaultHost="localhost" name="Catalina">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
<Context docBase="foo" path="/foo" reloadable="true" source="org.eclipse.jst.j2ee.server:foo"/></Host>
</Engine>
</Service>
</Server>
我不确定,但是如果您使用最新的驱动程序进行了更改,AbstractMethodError是LinkageError的一个子类,它几乎总是表明您的类路径有问题——未一起编译的库正在一起加载
假设你的图书馆版本符合我的即时研究
引发异常的行是。看起来是这样的:
((PreparedStatement)_stmt).setCharacterStream(parameterIndex, reader, length);
如果您单击至,您会看到它从1.6起被标记为
因此,你应该:
确保您在1.6+虚拟机下运行。:)
检查类路径中是否没有其他java.sql.PreparedStatement
的实现。我通常这样做的方式(在类Unix系统中;您可以自己使用Windows;)是:
cd/path/to/my/jars
grep-rli'java/sql/PreparedStatement'。
这是一种用蛮力计算出哪些jar包含哪些类的方法。它之所以有效,是因为ZIP文件的“目录结构”是纯文本,而不是压缩的
祝你好运!:) 解决方案是使用tomcat 7。这是tomcat-dbcp.jar的一个版本,它实际上具有应用程序所需的DelegatingPreparedStatement.setCharacterStream
我的问题是,当我在Tomcat7服务器上尝试它时,我仍然在应用程序的同一个地方遇到相同的错误。这是由mysql connector java(5.0.5,如果我没记错的话)的旧版本造成的,由于之前的尝试,该版本一直存在于我的tomcat lib文件夹中。这个旧版本显然优先于我自己的mysql连接器java(最新版本),我将其作为依赖项。因为这给了我同样的例外,它似乎没有改变我的处境,但它确实改变了
当我发现这一点时,剩下的事情很简单,我唯一的问题是我不能很容易地升级到tomcat 7,因为其他应用程序目前正在生产环境中运行我们的tomcat 6版本。因此,解决方案是将tomcat-dbcp.jar从tomcat 7 dist复制到我们的tomcat 6服务器,并替换已经存在的服务器
希望这也能帮助其他人,感谢大家在任何情况下给予的帮助 我也遇到了这个问题,发现了这个问题。我接受了最后一个答案中的建议,但我没有复制tomcat-dbcp.jar,而是在pom.xml中切换到了一个新版本,它可以工作!谢谢你的建议 也有同样的问题,通过更改驱动程序库解决了这个问题。
DelegatingPreparedStatement的实现将setCharacterStream调用委托给其委托,这就是为什么更改驱动程序的实现可以解决问题(如果委托的实现包括该方法)我使用的是mysql connector java 5.1.26,这是oracle提供的最新版本。这是一个问题吗?这个已经是最新的文件,你能分享你的tomcat server.xml文件吗?谢谢你的信息,它给了我一些新的视角来寻找解决方案。什么的新版本?mysql连接器?啊,tomcat dbcp的一个新版本。说实话,我还没有真正尝试过,我会检查这是否也解决了我们的问题。这显然是从repo中提取依赖项的更好解决方案,而不是在tomcat lib文件夹中实际使用更新版本。当我有时间测试时,我会告诉你结果。对我来说,修复方法是将commons lib更新为1.4版:commons.dbcp.version>1.4问题是我们希望tomcat管理所有数据库连接,所以我们不使用commons.dbcp,但是tomcat dbcpinstead@lugte098这是一个非常有用的解决方案,很高兴它帮助了其他人myself@tibi谢谢你的建议,它也解决了我的问题。