您的位置:程序门 -> java -> j2ee / ejb / jms



成功lookup后,classcastexception


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


成功lookup后,classcastexception[已结贴,结贴人:luocolor1]
发表于:2007-08-21 04:05:23 楼主
jboss   4.0.4上运行ejb3+jsf的工程。

ejb部分分层为:实体bean,dao和manager,jsf分层为backing   bean和展示层。

在manager层有interface   entitymanager,并entitymanagerbean实现他,在entitymanagerbean中通过

@ejb注入dao,manager层则通过storeobject(object)--> dao.storeobject(object)完成中间的过度操作

,dao中用函数storeobject(object){em.persist()}持久化对象。

具体有定义一个stateless的bean,
@stateless
@remote({employeemanager.class})
@local({employeemanager.class})
public   class   employeemanagerbean   implements   employeemanager   {

在jsf的backing   bean层,通过lookup查找jndi。
employeemanager   em   =   (employeemanager)ctx.lookup( "log/employeemanagerbean/remote ");可以确定

的是,这个查找已经成功返回了。

但问题出现了,
当我用通过查找并cast的employeemanager   em来em.storeobject()会出现异常:
caused   by:   java.lang.classcastexception:   org.jboss.remoting.invokerlocator
at   org.jboss.aspects.remoting.invokeremoteinterceptor.invoke

(invokeremoteinterceptor.java:47)
at   org.jboss.aop.joinpoint.methodinvocation.invokenext(methodinvocation.java:101)
at   org.jboss.aspects.tx.clienttxpropagationinterceptor.invoke

(clienttxpropagationinterceptor.java:61)
at   org.jboss.aop.joinpoint.methodinvocation.invokenext(methodinvocation.java:101)
at   org.jboss.aspects.security.securityclientinterceptor.invoke

(securityclientinterceptor.java:55)
at   org.jboss.aop.joinpoint.methodinvocation.invokenext(methodinvocation.java:101)
at   org.jboss.ejb3.remoting.islocalinterceptor.invoke(islocalinterceptor.java:65)
at   org.jboss.aop.joinpoint.methodinvocation.invokenext(methodinvocation.java:101)
at   org.jboss.ejb3.stateless.statelessremoteproxy.invoke

(statelessremoteproxy.java:102)
at   $proxy311.storeobject(unknown   source)

花了很多时间去google,大都讲到和class   loader相关。但,试的结果都还不行。
在http://www.jboss.org/index.html?

module=bb&op=viewtopic&t=101108&postdays=0&postorder=asc&start=0上,有这样的回答:
you   probably   have   a   classloader   issue.   looks   like   the   code   that   does   the   casting   is   in   a  

servlet.   you   do   not,   by   any   chance,   have   the   aplentityfacade   class   in   both   the   ejb   jar   file  

and   in   a   jar   file   (or   in   the   classes   directory)   in   your   war   file?
还有:
peter-

nice   catch...   that   was   indeed   the   problem.   i   forgot   about   that   whole   "class   identity   =   class  

+   classloader "   thing,   and   was   lazy   about   how   i   had   configured   ant.   there   are   also   some  

useful   wiki   pages   on   this   and   other   potential   classloader   issues:
http://wiki.jboss.org/wiki/wiki.jsp?page=classloadingoverview

因为对jboss刚接触不久,对于上面的e文理解不透彻?希望达人帮下忙,我要怎样解决呢?
发表于:2007-08-21 09:13:071楼 得分:10


                object   objref   =   initial.lookup(codednames.tx_ejbhome);

                employeemanager   em   =(employeemanager)   portableremoteobject.narrow(objref,
                        localtxhome.class);
发表于:2007-08-21 09:13:552楼 得分:0
不好意思,重来一下


                object   objref   =   initial.lookup(codednames.tx_ejbhome);

                employeemanager   em   =(employeemanager)   portableremoteobject.narrow(objref,
                        employeemanager.class);
发表于:2007-08-21 09:14:503楼 得分:0
真不好意思,再重来一下


                object   objref   =   initial.lookup( "log/employeemanagerbean/remote ");

                employeemanager   em   =(employeemanager)   portableremoteobject.narrow(objref,
                        employeemanager.class);

发表于:2007-08-21 09:42:024楼 得分:2
我的经验是,ejb重新部署后,web应用也重新部署一下就行了
发表于:2007-08-21 10:08:525楼 得分:2
我的经验是java.lang.classcastexception一般是因为装载的classloader不一致,楼主可以跟踪一下,web应用的classloader和业务层的classlaoder通常是不一样的,让一个web的对业务层的是可见的。
发表于:2007-08-21 12:48:506楼 得分:0
to   all:
多谢你们的回复。

对于cl55(cl)   的方法,我试了。但跟踪的结果:objref和em是相同的,都是proxy,整个运行的结果还是castexception。

因为我的是整个enterprise的工程,所以deploy的时候总是ejb和web应用都同时重新部署的,所以。。。。。。

schumixsuse(我记住了名字,却忘记了密码)   ,你说的我不大懂,“让一个web的对业务层的是可见的。”对于这个,可以给我一个baidu或者google关键词,我去搜下么?
发表于:2007-08-21 16:50:247楼 得分:6
试试这个吧,把
deploy\jbossweb-tomcat55.sar\meta-inf\jboss-service.xml
的   usejbosswebloader   改为true,再重启服务器看看
发表于:2007-08-25 13:48:078楼 得分:0
多谢,现在已经解决了。
原因应该还是classloader的问题,但不是goingchan(goingchan)提到的,只是在部署的时候做了下调整。
整个工程用的是myeclipse来建的,建好后有test,testejb,testweb三个,以前是用test将整个工程一起deploy的,现在改了下,只是deploy   testejb和testweb。以前有问题是classloader在找包的时候可能存在冲突。
现在我是处在要懂不懂,似懂非懂阶段,希望大家多指教啊!
当然,在lookup的时候偶,用的是cl55(cl)   的方法。
好了,结贴。


快速检索

最新资讯
热门点击