[英]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.