首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Karaf OSGI Aries Blueprint ClassCastException: Impl不能转换为接口

Karaf OSGI Aries Blueprint ClassCastException: Impl不能转换为接口
EN

Stack Overflow用户
提问于 2012-12-31 10:28:17
回答 1查看 1.9K关注 0票数 3

Karafv2.3.0,org.apache.aries.blueprint.core:1.0.1,在从另一个包导入的服务上调用接口方法时抛出ClassCastException。接口方法在接口上定义,并由实现类实现。我不明白服务代理如何认为它是Impl (TicketServiceImpl)而不是接口(TicketService)。我非常感谢任何关于如何解决这个问题的建议或建议。

例外:

代码语言:javascript
复制
    Caused by: java.lang.ClassCastException: 
    org.abc.TicketServiceImpl cannot be cast to
    org.abc.TicketService at 
    Proxy3ac85313_c60c_42db_8def_ea7bd3d7411c.add(Unknown Source)
    ...
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.6.0_37]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)[:1.6.0_37]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)[:1.6.0_37]
    at java.lang.reflect.Method.invoke(Method.java:597)[:1.6.0_37]
    at org.apache.aries.blueprint.utils.ReflectionUtils.invoke(ReflectionUtils.java:297)[7:org.apache.aries.blueprint.core:1.0.1]
    at org.apache.aries.blueprint.container.BeanRecipe.invoke(BeanRecipe.java:958)[7:org.apache.aries.blueprint.core:1.0.1]
    ...

奇怪的是,就在异常之前,我打印了代理.getInterfaces(),这意味着代理是TicketService,而不是TicketServiceImpl。

代码语言:javascript
复制
    MyTicketServer proxy interfaces: org.abc.TicketService, 
    org.apache.aries.proxy.weaving.WovenProxy 
    MyTicketServer Proxy class name: Proxy3ac85313_c60c_42db_8def_ea7bd3d7411c

我还尝试在代理上强制执行类测试:

代码语言:javascript
复制
    if (myTicketService instanceof TicketService) { <-- you'd think this would help
        myTicketService.add(ticket); //<-- Throws proxy ClassCastException!!
    } // implies problem is in the return path through proxy back to method
EN

回答 1

Stack Overflow用户

发布于 2013-01-01 00:59:26

就差一点了..。通过在客户端blueprint.xml中删除客户端bean上的“init- classCastException”,修复了TicketService上的方法。现在,它不是从init-method启动doProcess(),而是由driver.onRegisterService()启动,它调用client.doProcess(),后者调用TicketService.add(),没有问题,没有异常。

代码语言:javascript
复制
<bean id="driver" class="org.xyz.RetrieveDriver"></bean>
<service id="ticketRetriever" interface="org.xyz.TicketRetriever"
    ref="ticketRetrieverRT">
    <registration-listener ref="driver"
        registration-method="onRegisterService" 
        unregistration-method="onUnregisterService" />
</service>

这让我认为,在完成构建服务代理之前,客户端一直在尝试使用服务(在它的init-method=“doProcess”中)。我认为等待客户端正式注册的第三个类(驱动程序)将确保代理已准备好供客户端使用。

但是,然后我向客户端添加了第二个服务属性。第二个服务在其方法被调用时间歇性地抛出ClassCastException。现在我认为这可能是一个简单的老的竞态条件;我通过添加驱动程序稍微降低了客户端的速度,但还没有慢到足以阻止第二个服务在准备好之前被使用。这也可能是错误的。我对任何想法都心存感激。

如果问题没有神奇地消失,我将在假设服务还没有准备好的情况下为ClassCastException添加一个捕获。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14096802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档