gpt4 book ai didi

java - 使用 org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper 的最内层类时抛出异常

转载 作者:行者123 更新时间:2023-11-28 23:33:55 24 4
gpt4 key购买 nike

conn= Ds.getConnection();
连接oraconn = ((DelegatingConnection)conn).getInnermostDelegate();

它给出以下异常java.lang.ClassCastException: org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper 无法转换为 org.apache.commons.dbcp.DelegatingConnection

我还设置了资源参数accessToUnderlyingConnectionAllowed=true需要解包此对象以传递给 ArrayDescriptor在tomcat的server.xml中请提前帮助thanx

最佳答案

可能是您的 org.apache.commons.dbcp.DelegatingConnection 与连接中的 org.apache.commons.dbcp.DelegatingConnection 是不同的类(不同的类加载器)。

如果您通过容器绑定(bind)的 warfile 提供此类,并且连接是通过 tomcat(或其他应用程序服务器)实例化的,则可以这样。

要对此进行测试,您可以使用类似的东西:

Class.forName("org.apache.commons.dbcp.DelegatingConnection").getClassLoader().toString()
conn.getClassLoader().toString();

您可能无法使用反射。这来自类似的 question :

// 'source' is from another classloader
Method method = conn.getClass().getMethod("getInnermostDelegate", new Class[] {});
Object o = method.invoke(conn, new Object[] {});

但是,我不确定返回参数是否可以轻松转换为当前类加载器中的类。如果您遵循反射方法,请绝对确保将所有这些封装在一个类中,不要让 Method 和 Object 之类的东西从中流失。我不推荐这样做,但它应该有效。

另一种方法是将您的代码放在与连接相同的位置。 (tomcat 库)

当然,首先要检查您的代码是否确实使用了 2 个不同的类加载器。 :D

编辑:

从评论来看,这里似乎有 2 个类加载器在工作。我忘了提到第三种方法。

  1. 首选:从您的 war 文件中删除提供 DelegatingConnection 的 jar 文件,并依赖于由 common/lib 类加载器提供的它。
  2. 通过将 war 放在那里来在 common/lib 类加载器中运行你的代码
  3. 反射(reflect):可能不好,可能会给将结果对象转换为正确的类带来麻烦

关于java - 使用 org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper 的最内层类时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26843524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com