java.lang.ClassCastException:$ Proxy99无法强制转换

时间:2010-04-05 01:17:25

标签: java servlets jboss java-ee ejb-3.0

我正在使用JBoss4.2.2和java6。

部署之耳的名字是apa.ear

在servlet中,我有以下代码行:

placeBid = (PlaceBid) context.lookup("apa/"
  + PlaceBid.class.getSimpleName() + "/remote");

我有一个生成的jboss-app.xml,如下所示:

<jboss-app>
  <loader-repository>apa:app=ejb3</loader-repository>
</jboss-app>

当试图通过上下文获取PlaceBid时,我得到了这个异常

java.lang.ClassCastException: $Proxy99 cannot be cast to se.nextit.actionbazaar.buslogic.PlaceBid

PlaceBid界面如下所示:

@Remote
public interface PlaceBid {
 Long addBid(String userId, Long itemId, Double bidPrice);
}

当我运行EJB3的实例时,它可以工作。 EJB3在动作示例代码中附带了ant构建。我想使用Maven,所以我重新安排了一些代码。

但是,我不知道我在这里做错了什么。我对jboss-app.xml文件有一些想法。我不确定它的内容应该是什么样子。

感谢任何帮助。

祝愿Lasse

2 个答案:

答案 0 :(得分:1)

首先,请尝试以下方法:

Object obj = context.lookup("apa/" + PlaceBid.class.getSimpleName() + "/remote");
System.out.println("Object = " + obj.getClass().getName());
System.out.println("Interfaces = " + Arrays.toString(obj.getClass().getInterfaces()));

它将告诉您实际的stub特定类是什么以及它实现了什么接口。这可能会给你足够的暗示来解决出错的问题。

也可能是你的bean被定义为:

@Stateless
public class MyPlaceBidBean implements PlaceBid {
    ...
}

即。它实现了PlaceBid接口?

答案 1 :(得分:0)

如果context是javax.naming.Context(或InitialContext)类型,那么问题是你缺少对PortableRemoteObject.narrow的调用:

placeBid = (PlaceBid) PortableRemoteObject.narrow(context.lookup("apa/"
  + PlaceBid.class.getSimpleName() + "/remote", PlaceBid.class);

远程接口的EJB规范要求这样做。如果您使用引用(@EJB或ejb-ref),容器将为您处理缩小。