【问题标题】:ClassCastException for Remote Bean on Glassfish 3.1.2.2Glassfish 3.1.2.2 上远程 Bean 的 ClassCastException
【发布时间】:2015-08-31 15:04:11
【问题描述】:

当我尝试通过 InitialContext#lookup() 转换一个 Bean 时,我得到一个 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 注释的接口。我确实从查找中得到了一个对象,我通过

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

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

【问题讨论】:

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


    【解决方案1】:

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

    • 您可能希望让您的“远程”接口从 Serializable 扩展并提供一个 serialVersionUID。不过,这似乎没有必要。
    • 使用 maven war 插件时,请确保您没有将 archiveClasses 设置为 true。或者,如果您这样做了,请确保您的 beans.xml 位于正确的位置(src\main\resources\META-INF?)
    • 一定要使用 bean 的 interface jndi 名称。 IE。 : 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)

    【讨论】:

      猜你喜欢
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多