resultset.getObject 上的 AbstractMethodError
AbstractMethodError on resultset.getObject
所以我正在构建一个 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) ~[?:?]
etc...
抛出异常的代码位。
rs.getObject( field.getName(), p.fieldType());
rs
是一个从执行查询返回的 java.sql.ResultSet
实例。
p.fieldType()
只是returns一个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"));
returns1.8.0_51-b16
但是两者都在同一台 PC 上,所以我希望得到相同的值?
好的,很抱歉这个问题我已经重新考虑了我的方法。
我没有使用反射来设置 class 成员的类型,而是在每个数据模型 class 中实现了一个将 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;
};
至于我最初使用反射的问题,我不知道为什么会失败。
ResultSet.getObject(String columnLabel, Class<T> type)
方法是在 JDBC 4.1 (Java 7) 中添加的。看起来您使用的是 JDBC 4.0 驱动程序,而不是 JDBC 4.1(或 JDBC 4.2/Java 8)驱动程序。
您可能需要更新 JDBC 驱动程序(Connector/J MySQL driver 的最新版本是 5.1.38)。
所以我正在构建一个 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) ~[?:?] etc...
抛出异常的代码位。
rs.getObject( field.getName(), p.fieldType());
rs
是一个从执行查询返回的 java.sql.ResultSet
实例。
p.fieldType()
只是returns一个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"));
returns1.8.0_51-b16
但是两者都在同一台 PC 上,所以我希望得到相同的值?
好的,很抱歉这个问题我已经重新考虑了我的方法。 我没有使用反射来设置 class 成员的类型,而是在每个数据模型 class 中实现了一个将 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;
};
至于我最初使用反射的问题,我不知道为什么会失败。
ResultSet.getObject(String columnLabel, Class<T> type)
方法是在 JDBC 4.1 (Java 7) 中添加的。看起来您使用的是 JDBC 4.0 驱动程序,而不是 JDBC 4.1(或 JDBC 4.2/Java 8)驱动程序。
您可能需要更新 JDBC 驱动程序(Connector/J MySQL driver 的最新版本是 5.1.38)。