的SimpleDriverDataSource#setDriverClass(Class)
被實現爲
public void setDriverClass(Class<? extends Driver> driverClass) {
this.driver = BeanUtils.instantiateClass(driverClass);
}
所以它期待一個類型是Driver
亞型的Class
對象。
的Class.forName(String)
方法被實現爲
public static Class<?> forName(String className)
throws ClassNotFoundException {
return forName0(className, true, ClassLoader.getCallerClassLoader());
}
換句話說,它返回一個Class<?>
對象,即。任何類型的對象Class
,不一定是Driver
的子類型。因此,返回對象的聲明類型不是setDriverClass()
方法的有效參數。
一種解決方案是自己實例化Driver
類,並使用setDriver(Driver)
方法,而不是
Class<?> clazz = Class.forName(credentials.getDriverClass());
Object driver = BeanUtils.instantiateClass(clazz);
dataSource.setDriver((Driver) driver);
注意的是,以上在運行時會拋出一個ClassCastException
如果試圖將類實例不是Driver
一個亞型。
另外,as suggested by BalusC您可以通過Class.forName()
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
dataSource.setDriverClass((Class<Driver>)Class.forName("com.mysql.jdbc.Driver"));
投返回的值添加一些@SuppressWarnings
,如果你不喜歡的IDE警告。
憑證是bean類的對象憑藉setter和getter來獲取用戶,傳遞等。並且getDriverClass()返回字符串「Oracle.jdbc.OracleDriver」 – ssayyed