java - Tomcat 上的 AbstractMethodError setBinaryStream

标签 java tomcat jpa tomcat6 jndi

我正在开发一个由 tomcat 上的 hibernate 支持的 JPA 应用程序。我们也在使用 Spring 和 AOP。该数据库是 DB2 9.7 社区版。我们正在使用 Spring JNDI 查找从 tomcat 检索数据源。

这是与 Liferay 门户捆绑在一起的 tomcat 6.0.26。更新 tomcat 不是一个选项,因为我们在将 Liferay 升级到更新版本/ bundle 时遇到问题。

持久化在我们的测试用例中运行良好,但是对于 tomcat,我们得到以下异常。在我要存储附件之前,该应用程序运行良好。

Caused by: java.lang.AbstractMethodError: org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
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 $Proxy432.setBinaryStream(Unknown Source)
at org.hibernate.type.descriptor.sql.BlobTypeDescriptor$4$1.doBind(BlobTypeDescriptor.java:163)

在看其他问题Why do I get java.lang.AbstractMethodError when trying to load a blob in the db?问题似乎是使用了 jdbc3 驱动程序而不是 jdbc4 驱动程序。但是我确保我们拥有正确的 DB2 驱动程序版本“db2jcc4.jar 4.14.113”。相同的驱动程序适用于我们的测试用例。

当在别处搜索时,问题是 setBinaryStream 是用 long 而不是 int 调用的,但由于我不直接调用任何东西,所以我无法更改它。

相关实体:

@Table( name = "ATTACHMENT")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "somenamespace", name = "Attachment")
public class Attachment implements Serializable {
   private static final long serialVersionUID = 1L;

    /**
    */
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "ID", nullable = false)
   @Basic(fetch = FetchType.EAGER)
   @Id
   @XmlElement
   Integer id;
   /**
    */

   @Column(name = "ATTACHMENT", nullable = false)
   @Basic(fetch = FetchType.EAGER)
   @Lob
   @XmlElement
   byte[] attachment;

      .. getters/setters and other properties
}

可以做些什么来规避这个问题,让它像在测试用例中一样保存实体?

更新:可能不是数据库驱动程序本身,而是 tomcat 连接池不符合 JDBC4。 Tomcat 6 documentation说“DBCP 1.3 提供对 JDBC 3.0 的支持”。在查看 tomcat-dbcp vs commons-dbcp 时,用普通的 dbcp 交换它似乎不是一个好主意。 .

最佳答案

一段时间后我找到了解决方案。

我下载了 tomcat 7 并复制了 tomcat-dbcp。

tomcat-dbcp 7 包含 dbcp 1.4 并提供 JDBC 4.0 支持。

关于java - Tomcat 上的 AbstractMethodError setBinaryStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14141452/

相关文章:

java - JMeter 中 Java 和 HTTP Client 4 实现的发送字节和连接时间的差异

java - 内存不足错误,permgen,从 java 8 到 java 7

java - Struts 2 Spring Framework 上的常规 HTML 页面

jpa - JPA中如何实现自连接?

java - 如何将文件从一个 URL 复制到另一个 URL 而不存储在本地计算机上

Java:如何在编译时找到方法的调用者?

java - Tomcat 并在请求中混合 POST 和 GET 参数

java - Hibernate 嵌套延迟加载和 LazyInitializationException

java - 为什么 JPA 元模型中的所有字段均为空?

java - 在 Java Spring boot jpa 中将 List<Map<String, String>> 转换为对象