通过JNDI调用EJB时​​出现ClassCastException

时间:2016-06-01 07:49:00

标签: ejb weblogic jndi ear

我在通过JNDI调用Pojo中的EJB时遇到了ClassCastException。我使用Oracle Weblogic Server 10.3.6(EJB 3.0)。

我的结构:

  • app.ear
    • LIB
      • Interfaces.jar
        • MyBeanInterface.java
    • ejb.jar
      • MyBeanImpl.java
    • webapp.war
      • Client.java
      • WEB-INF
        • 的web.xml

我的本​​地界面:

package mypackage;

@Local
public Interface MyBeanInterface {}

我的EJB-Class:

package mypackage;

@Stateless(name = "MyBean")
public class MyBeanImpl implements MyBeanInterface {}

我的客户端(不是EJB):

MyBeanInterface bean = (MyBeanInterface) new InitialContext().lookup("java:comp/env/ejb/MyBean");

我的web.xml

 <ejb-local-ref>
   <ejb-ref-name>ejb/MyBean</ejb-ref-name>
   <ejb-ref-type>Session</ejb-ref-type>
   <local>mypackage.MyBeanInterface</local>
</ejb-local-ref>

我的例外:

Lookup本身有效。我得到一个参考。但是当我想使用(MyBeanInterface)进行强制转换时,我收到以下错误:

无法将“class mypackage.MyBeanInterface_whjkp6_MyBeanImpl(由weblogic.utils.classloaders.GenericClassLoader(id = 28136))的实例加载”的实例强制转换为“interface mypackage.MyBeanInterface”的实例(由weblogic.utils实例加载。 classloaders.GenericClassLoader(ID = 28144))

我该怎么办?

1 个答案:

答案 0 :(得分:0)

似乎这些类是由不同的类加载器加载的。可能的选择是:

1)确保类由相同的类加载器加载

2)使用反射

3)序列化然后反序列化

参见:

1)cast across classloader?

2)https://community.oracle.com/thread/757133

3)ClassCastException because of classloaders?