Glassfish 3.1.2.2上的远程Bean的ClassCastException

时间:2015-08-31 15:04:11

标签: java-ee ejb-3.0 jndi java-ee-6 glassfish-3

当我尝试转换Bean时,我通过InitialContext#lookup()获得了类似的ClassCastException:

java.lang.ClassCastException: EJB31_Generated__MyTestBean__Intf____Bean__ cannot be cast to ...

java.lang.ClassCastException: com.sun.proxy.$Proxy338 cannot be cast to de.package.name.beans.YourBeanInterface

其中MyTestBean是我正在尝试访问的Bean。

两个应用都在同一个网络服务器上运行。 MyTestBean实现了一个使用@ javax.ejb.Remote注释的接口。我从查找中获取了一个Object,并通过

进行了检查
logger.e(Arrays.toString(o.getClass().getInterfaces()));
logger.e(Arrays.toString(o.getClass().getMethods()));

它确实实现了那个非常接口甚至有方法。我甚至可以通过反射成功调用这些方法。

1 个答案:

答案 0 :(得分:0)

我不知道最终解决了什么,无法追踪它。但这里有一些我学到的东西,可能有助于追踪这个问题:

  • 您可能希望让您的" Remote" -Interface从Serializable扩展并提供serialVersionUID。但是,似乎没有必要。
  • 使用maven war插件时,请确保未将archiveClasses设置为true。或者,如果您这样做,请确保您的beans.xml位于正确的位置(src \ main \ resources \ META-INF?)
  • 请务必使用bean的 interface jndi名称。即:ctx.lookup(" java:global / youarpp / YourBean!de.package.name.beans.YourBeanInterface"); - 不是实施。
  • 请务必使用正确的@ javax.inject.Singleton或@ javax.ejb.Singleton,有关更多说明,请参阅http://germanescobar.net/2010/04/4-areas-of-possible-confusion-in-jee6.html
  • 如果要在应用程序中注入实现(不仅仅是界面),您可能必须使用@LocalBean
  • 一般来说,如果行为看起来很奇怪,请尝试停止/启动域并不时清除glassfish实例的任何文件夹(应用程序,生成,osgi-cache)