簡體   English   中英

僅在重啟后才在karaf中執行ClassCastException

[英]ClassCastException in karaf only after restart

我有兩個版本為05.18.000的Bundles A,使用的是Bundle C中使用的B. of 05.18.000。

和我在捆綁包D中使用了不同版本05.20.000的相同捆綁包A和B。

捆綁軟件A試圖將具體的類強制轉換為接口。 接口和實現類都在捆綁軟件B中。

當我在運行時同時使用C和D時,它們都工作正常。

但是,當我重新啟動karaf容器時,在Bundle A中會引發類強制轉換異常。

@Override
public String parse(DeviceMessageEnvelope deviceMessageEnvelope) {

    String result = "NO RESULTS";
    LOGGER.debug("HL7MinaServerParserControllerBase.parse called.");
    try {
        HL7MinaServerCommunicationObject commObject = getHL7MinaServerCommunicationObject();

        commObject.initObject((MinaServerCom) getDeviceCom(), deviceMessageEnvelope, getParser());

        LOGGER.debug("HL7MinaServerParserControllerBase: Attempted to connect device com");
        boolean connected = getDeviceCom().connect();

        if (connected) {
            while (commObject.isRunning()) {
                LOGGER.debug("HL7MinaServerParserControllerBase.parse : In Loop isRunning() : " + commObject.isRunning());
                Thread.sleep(getWaitTime());
            }
            LOGGER.debug("HL7MinaServerParserControllerBase.parse : Exit from while commObject.isRunning()");
            result = commObject.getResult();
        }
    } catch (InterruptedException e) {
        LOGGER.warn("HL7MinaServerParserControllerBase.parse :  Error in HL7MinaServerParserControllerBase", e);
    } catch (CommunicationException e) {
        LOGGER.warn("HL7MinaServerParserControllerBase.parse :  Error in HL7MinaServerParserControllerBase", e);
    } catch (MinaSupportConfigurationException e) {
        LOGGER.warn("HL7MinaServerParserControllerBase.parse :  Error in HL7MinaServerParserControllerBase", e);
    } finally {
        try {
            getDeviceCom().release();
        } catch (CommunicationException e) {
            LOGGER.warn("HL7MinaServerParserControllerBase : Error trying to release the com", e);
        }
    }

    return result;
}

下面是錯誤:

[2018-03-01 22:46:38.287] [Device Id: 10237 Device Name : WA_CMS_GW] ERROR com.company.driver.factory.DeviceTask                            com.company.drvs.sdk.mina.com.server.types.MinaServerComImpl cannot be cast to com.company.drvs.sdk.mina.com.server.MinaServerCom
java.lang.ClassCastException: com.company.drvs.sdk.mina.com.server.types.MinaServerComImpl cannot be cast to com.company.drvs.sdk.mina.com.server.MinaServerCom
    at com.company.drvs.sdk.mina.com.server.types.parser.HL7MinaServerParserControllerBase.parse(HL7MinaServerParserControllerBase.java:43)[411:com.company.drvs.sdk.company-sdk-mina-support-hl7:5.20.0]
    at com.company.drvs.welchallyn.nce.parser.NCEParserController.getResult(NCEParserController.java:57)[412:com.company.drvs.welchallyn-nce.core:1.0.1]
    at com.company.drvs.welchallyn.nce.parser.NCEParserController.parse(NCEParserController.java:45)[412:com.company.drvs.welchallyn-nce.core:1.0.1]
    at com.company.drvs.welchallyn.nce.driver.Driver.execute(Driver.java:67)[412:com.company.drvs.welchallyn-nce.core:1.0.1]
    at com.company.driver.factory.DeviceTask.execute(DeviceTask.java:46)[321:com.company.dxc.DriverHarness:1.10.1.GA]
    at com.company.task.CycleTaskHarness.run(CycleTaskHarness.java:88)[312:com.company.dxc.TaskRunner:1.10.1.GA]
    at java.lang.Thread.run(Thread.java:748)[:1.8.0_161]
[2018-03-01 22:46:38.287] [Device Id: 10237 Device Name : WA_CMS_GW] WARN  com.company.task.CycleTaskHarness                                Task retry: Device Id: 10237 Device Name : WA_CMS_GW, com.company.task.TaskException: com.company.drvs.sdk.mina.com.server.types.MinaServerComImpl cannot be cast to com.company.drvs.sdk.mina.com.server.MinaServerCom
[2018-03-01 22:46:38.287] [Device Id: 10237 Device Name : WA_CMS_GW] ERROR com.company.task.CycleTaskHarness                                Task error:
com.company.task.TaskException: com.company.drvs.sdk.mina.com.server.types.MinaServerComImpl cannot be cast to com.company.drvs.sdk.mina.com.server.MinaServerCom
    at com.company.driver.factory.DeviceTask.execute(DeviceTask.java:54)[321:com.company.dxc.DriverHarness:1.10.1.GA]
    at com.company.task.CycleTaskHarness.run(CycleTaskHarness.java:88)[312:com.company.dxc.TaskRunner:1.10.1.GA]
    at java.lang.Thread.run(Thread.java:748)[:1.8.0_161]
Caused by: java.lang.ClassCastException: com.company.drvs.sdk.mina.com.server.types.MinaServerComImpl cannot be cast to com.company.drvs.sdk.mina.com.server.MinaServerCom
    at com.company.drvs.sdk.mina.com.server.types.parser.HL7MinaServerParserControllerBase.parse(HL7MinaServerParserControllerBase.java:43)[411:com.company.drvs.sdk.company-sdk-mina-support-hl7:5.20.0]
    at com.company.drvs.welchallyn.nce.parser.NCEParserController.getResult(NCEParserController.java:57)[412:com.company.drvs.welchallyn-nce.core:1.0.1]
    at com.company.drvs.welchallyn.nce.parser.NCEParserController.parse(NCEParserController.java:45)[412:com.company.drvs.welchallyn-nce.core:1.0.1]
    at com.company.drvs.welchallyn.nce.driver.Driver.execute(Driver.java:67)[412:com.company.drvs.welchallyn-nce.core:1.0.1]
    at com.company.driver.factory.DeviceTask.execute(DeviceTask.java:46)[321:com.company.dxc.DriverHarness:1.10.1.GA]
    ... 2 more

company-sdk-mina-support-hl7:5.20.0是提及的捆綁軟件A。

MinaServerComImpl和MinaServerCom是Bundle B中的實現和接口。

該行中發生錯誤

commObject.initObject((MinaServerCom) getDeviceCom(), deviceMessageEnvelope, getParser());

MinsServerComImpl通過spring注入,並且getDeviceCom()返回MinaServerComImpl的實例。

請幫忙。 謝謝。

造成這種情況的常見原因是,同一類具有多個定義。

在Java中,類的標識是其完全限定名稱定義ClassLoader的組合。 如果兩個類加載器定義一個類(即使就磁盤上的字節而言,甚至使用相同的類數據),則它們將被視為JVM中的不同類。 從那些類定義之一繼承的任何子類將不被視為另一種定義的子類型。

在您的情況下,您可能已將MinaServerCom類復制到多個包中。 相反,請確保該定義僅在一個捆綁包中,應從該捆綁包中導出該包。 其他捆綁軟件應導入該軟件包。

之所以出現ClassCastException是因為一個類的任何對象不能僅由於它們不在“父子”關系中而無法轉換為另一個。

如您所說..這條線有問題..

commObject.initObject((MinaServerCom) getDeviceCom(), deviceMessageEnvelope, getParser());

這里getDeviceCom()返回的對象MinsServerComImpl並嘗試將其轉換成MinaServerCom 那么請確保這兩個類之間沒有任何Is-A關系。

應該是

class MinsServerComImpl extends MinaServerCom

要么

class MinsServerComImpl implements MinaServerCom

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM