karaf v2.3.0,org.apache.aries.blueprint.core:1.0.1,当从另一个捆绑包中导入的服务上调用接口方法时,throws classcastException。接口方法是在接口上定义的,并由实现类实现。我无法弄清楚服务代理是如何认为它的Impl(ticketserviceimpl)而不是接口(ticketservice)。我感谢有关如何解决此问题的任何建议或建议。
例外:
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。
MyTicketServer proxy interfaces: org.abc.TicketService,
org.apache.aries.proxy.weaving.WovenProxy
MyTicketServer Proxy class name: Proxy3ac85313_c60c_42db_8def_ea7bd3d7411c
我还尝试在代理上强迫课程测试:
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
几乎得到了... ticketservice上的classcastException是通过在客户端blueprint.xml中删除客户端bean上的" init-method"来修复的。现在,它不是由Init-Method启动的DoProcess(),而是由driver.onregisterservice()启动,该driver.onregisterservice()调用client.doprocess(),它毫无问题,无例外。
<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添加一个捕获,假设服务尚未准备就绪。