我试图从 JBoss EAP 6.4 上的 JNDI loopup 获取 TimesTenDataSource。我在standalone.xml 中为timesten 配置了数据库。如果我使用标准 Jdbc 对象,即 DataSource、Connection、PreparedStatement,那么一切正常。出于某种原因,我想使用来自 ttjdbc8.jar 的 TimesTen 特定的 TimesTenDataSource、TimesTenConnection 和 TimesTenCallableStatement 对象。这个 jar 文件放在 JBoss 模块目录中。
InitialContext ic = new InitialContext();
TimesTenDataSource ds = null;
DataSource ods = (DataSource) ic.lookup(databaseJDNIName);
log.info("Original data source is " + ods);
/*** above line prints -- Original data source is org.jboss.jca.adapters.jdbc.WrapperDataSource@16174fbf ***/
TimesTenDataSource ds = ods.unwrap(com.timesten.jdbc.TimesTenDataSource.class);
/** ds is null here **/
TimesTenConnection tconn = ds.getConnection(); // throws null pointer exception
作为对这个线程的引用,我调用 unwrap 来获取底层的 TimesTen 连接。
调试上面的代码表明 WrapperDataSource 没有实现扩展类 JBossWrapper 中的 getWrappedObject() 方法。
/**
* Get the wrapped object - override in sub-classes
* @return The object
* @exception SQLException Thrown if an error occurs
*/
protected Object getWrappedObject() throws SQLException
{
return null;
}
这是 JbossWrapper 类中的 unwrap 方法
if (iface == null)
throw new IllegalArgumentException("Null interface");
if (iface.isAssignableFrom(getClass()))
return iface.cast(this);
Object wrapped = unwrapInnerMost(**getWrappedObject()**, iface);
由于 getWrappedObject() 返回 null 一切都失败了。
也无法直接将 WrapperDataSource 转换为 TimesTenDataSource,这样做会导致 ClassCastException。