结果集.getObject 上的 AbstractMethodError

Posted

技术标签:

【中文标题】结果集.getObject 上的 AbstractMethodError【英文标题】:AbstractMethodError on resultset.getObject 【发布时间】:2016-05-01 07:19:18 【问题描述】:

所以我正在构建一个 minecraft 插件,插件的一部分从 mysql 中抓取一堆块数据,并在服务器启动时将其加载到缓存中。我有一些在 Eclipse 测试用例中运行良好的代码。但是,当我在本地 minecraft 服务器中加载插件时,我得到了异常。

java.lang.AbstractMethodError: 方法 com/mysql/jdbc/JDBC4ResultSet.getObject(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object;是抽象的 在 com.mysql.jdbc.JDBC4ResultSet.getObject(JDBC4ResultSet.java) ~[spigot-1.8.8.jar:git-Spigot-db6de12-d3e0b6f] 在 fws.plugins.trigger.database.ModelDB.loadCollection(ModelDB.java:335) ~[?:?] 在 fws.plugins.trigger.database.ModelDB.all(ModelDB.java:295) ~[?:?] 等等...

抛出异常的代码位。

rs.getObject( field.getName(), p.fieldType());

rs 是从执行查询返回的java.sql.ResultSet 实例。 p.fieldType() 只返回一个Class<?>

稍微大一点的 sn-p... 并不是说​​它真的向您展示了其他任何东西。

if (field.isAnnotationPresent(Persist.class)) 
    try 
        Persist p = field.getAnnotation(Persist.class);
        Object o = rs.getObject( field.getName(), p.fieldType());
        field.set(m,p.fieldType().cast(o));

     catch (Exception e) 
        // TODO Auto-generated catch block 
        e.printStackTrace();
     

我看过网上的人说要修复我需要包含 ojdbc6.jar 并将其用作我的连接驱动程序。 我将文件添加到文件夹 lib 下的项目结构中,将其包含到我的项目中,然后将其添加到我的构建文件中。 http://i.imgur.com/7TXLbjj.png 并将连接驱动程序更改为oracle.jdbc.OracleDriver

但是,我遇到了同样的问题,似乎没有解决办法。 虽然很可能我做错了。

谁能帮助我,有什么见解等吗?

编辑** 从命令行

$ java -version
java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)

来自日食

System.out.println(System.getProperty("java.runtime.version"));

返回 1.8.0_51-b16

但是两者都在同一台 PC 上,所以我期望相同的值?

【问题讨论】:

我认为可能存在 JDK 问题。您在本地机器上使用哪个 JDK 版本,在服务器上使用哪个版本?请看这篇文章:***.com/questions/7692320/… 似乎是 1.8.0_51 应该没问题,其他答案与我的情况无关,我不认为。 Ojdbc16.jar 是 oracle db 的驱动程序 - 不是 mysql 的驱动程序。在dev.mysql.com/downloads/connector/j 上查看最新的 mysql 驱动程序,看看是否有帮助 是的,我用的是什么:/ 它在 eclipse 中工作,而不是在 minecraft 环境中 【参考方案1】:

在 JDBC 4.1 (Java 7) 中添加了 ResultSet.getObject(String columnLabel, Class<T> type) 方法。看起来您使用的是 JDBC 4.0 驱动程序,而不是 JDBC 4.1(或 JDBC 4.2/Java 8)驱动程序。

您可能需要更新 JDBC 驱动程序(Connector/J MySQL driver 的最新版本是 5.1.38)。

【讨论】:

【参考方案2】:

好的,对不起,我重新考虑了我的方法。 我没有使用反射来设置类成员的类型,而是在每个数据模型类中实现了一个方法,将 ResultSet 值映射到当前对象。

@Override
public Select load(ResultSet rs) throws SQLException 
    this.id = rs.getInt("id");
    this.name = rs.getString("name");
    this.uuid = rs.getString("uuid");
    this.chunkX = rs.getInt("chunkX");
    this.chunkZ = rs.getInt("chunkZ");
    this.blockX = rs.getInt("blockX");
    this.blockY = rs.getInt("blockY");
    this.blockZ = rs.getInt("blockZ");
    return this;
;

至于我最初使用反射的问题,我不知道为什么会失败。

【讨论】:

以上是关于结果集.getObject 上的 AbstractMethodError的主要内容,如果未能解决你的问题,请参考以下文章

VFP控制Excel操作集

参考光标和结果集

对象管理器 getObject:self 方法上的 RestKit 和 Core Data 实体崩溃

[NSDictionary getObjects:andKeys:] 示例

将 Dbeaver 上的结果集导出到 CSV

cassandra中bigint