结果集调用getObject方法时出现AbstractMethodError错误

9
我正在开发一个Minecraft插件,其中一部分从MySQL中获取大量块数据并在服务器启动时将其加载到缓存中。我有一些代码,在Eclipse测试用例中可以正常运行。然而,当我在本地Minecraft服务器中加载插件时,会出现异常。

    java.lang.AbstractMethodError: Method com/mysql/jdbc/JDBC4ResultSet.getObject(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object; is abstract
            at com.mysql.jdbc.JDBC4ResultSet.getObject(JDBC4ResultSet.java) ~[spigot-1.8.8.jar:git-Spigot-db6de12-d3e0b6f]
            at fws.plugins.trigger.database.ModelDB.loadCollection(ModelDB.java:335) ~[?:?]
            at fws.plugins.trigger.database.ModelDB.all(ModelDB.java:295) ~[?:?]
等等...



引起异常的代码段。

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

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



稍微大一点的片段……但它并没有展示其他任何东西。

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)


来自Eclipse

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

返回 1.8.0_51-b16



但是两者都在同一台计算机上,所以我期望的值应该是相同的吗?


我认为可能存在JDK问题。您在本地机器上使用哪个JDK版本,服务器上使用哪个版本?请参阅此帖子:https://dev59.com/rFzUa4cB1Zd3GeqPzAVg - Mananpreet Singh
似乎是1.8.0_51,这应该没问题,而且其他答案与我的情况无关,我不认为有用。 - zenril
Ojdbc16.jar是Oracle数据库的驱动程序,不适用于MySQL。请访问https://dev.mysql.com/downloads/connector/j/获取最新的MySQL驱动程序,并查看是否有所帮助。 - Jan
是的,那就是我一直在使用的:/ - zenril
它在Eclipse中工作,但在Minecraft环境中不起作用。 - zenril
2个回答

9

1

好的,对于我的问题表示抱歉,我重新考虑了我的方法。不再使用反射来设置类成员的类型,而是在每个数据模型类中实现一个方法,将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;
};

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接