eclipse 在Liberty中运行ECIConnectionFactory时出现ClassCastException

xhv8bpkk  于 2022-11-29  发布在  Eclipse
关注(0)|答案(2)|浏览(232)

问题-我收到以下消息:
java.lang.ClassCastException: com.ibm.connector2.cics.ECIConnectionFactory incompatible with com.ibm.connector2.cics.ECIConnectionFactory
我收到它时试图作出以下声明:
eisDci = (ECIConnectionFactory)ctx.lookup(eisn);
'eisDci'先前已定义:private static ECIConnectionFactory eisDci = null;
“eis”是具有连接名称的字符串,如“eis/DCIXxxxECI”
这些连接在Server.xml中定义:

<connectionFactory id="DCIXxxxECI" jndiName="eis/DCIXxxxECI">
        <properties.cicseci ServerName="XXXX" TPNName="xx" connectionUrl="url" portNumber="2006"/>
</connectionFactory>

我知道这是在警告我不能进行强制转换。我不知道的是我做错了什么。这一定是在比较一个版本的ECIConnectionFactory类和另一个版本的ECIConnectionFactory类。
我正在使用的服务器是一个Liberty,我快疯了,我不明白为什么Eclipse要比较两个不同的版本。
我搜索过的类似问题:
ClassCastException when casting to the same class
Waxwing的回答看起来不错,但我没有权限进行这些更改,此连接是由外部库执行的。
首先感谢您的回答Ben考克斯,在Liberty的server.xml(本地)中,我已经声明了该库:

<fileset caseSensitive="false" dir="C:\CICSECI"/>

在Liberty运行时/Shared/resources中,我有cicseci.rar,我已经在server.xml中将其声明为resourceAdapter:

<resourceAdapter autoStart="true" id="cicseci" location="${shared.resource.dir}/cicseci.rar">
    <classloader apiTypeVisibility="spec, ibm-api, api, third-party"/>
</resourceAdapter>

我已经检查了要导入到项目中的其余库,到目前为止,我还没有看到我有重复的库。

已解决

我从我的计算机的不同目录导入全局库,在其中两个库中,不同版本的库被重复,过时的版本被重命名,但没关系,系统将它们识别为.jar并加载它们,产生了冲突。
你帮了我很多,为此,谢谢你.

kxeu7u2r

kxeu7u2r1#

我认为这里的问题与资源适配器和应用程序之间的类加载有关。这是我们在DataSources中更常见的问题,但结果是相同的。
问题是同一个jar被两个不同的类加载器加载。一个类加载器用于资源适配器,另一个类加载器用于您的应用程序。

<library id=cicseci>
  <file name="${shared.resource.dir}/cicseci.rar"/>
</library>

<resourceAdapter autoStart="true" id="cicseciRA">
    <classloader commonLibraryRef="cicseci"/>
</resourceAdapter>

<connectionFactory id="DCIXxxxECI" jndiName="eis/DCIXxxxECI">
        <properties.cicseci ServerName="XXXX" TPNName="xx" connectionUrl="url" portNumber="2006"/>
</connectionFactory>

<!-- Location of app that is trying to cast ECIConnectionFactory -->
<application location="${shared.resource.dir}/cicseci.rar">
  <classloader commonLibraryRef="cicseci"/>
</application>

在此配置中,cicseci.rar将仅加载一次。

vq8itlhq

vq8itlhq2#

当两个不同的类加载器加载同一个类时,可能会发生ClassCastException,从而使看似相同的类不兼容。
为避免这种情况,您应该使用的机制包括使用resourceAdapter的classProviderRef配置应用程序的类加载器,这在here中有说明。

<application location=...>
  <classloader classProviderRef="cicseci"/>
</application>

相关问题