在AS7中调用查询EJB视图时,ClassCastException [英] ClassCastException when casting looked-up EJB view in AS7

查看:145
本文介绍了在AS7中调用查询EJB视图时,ClassCastException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经在JBoss AS 7.1.0.Alpha1-SNAPSHOT(后7.0.1.Final版本)上部署了2个EAR。两者都部署得很好。



我在一个JAR内部有一个EJB Singleton类,其中一个EAR:



<$一个@Local(Store.class),@Remote(Store.class),@LocalBean
@TransactionAttribute (TransactionAttributeType.NOT_SUPPORTED)
@Transactional(TransactionPropagation.SUPPORTS)
public class StoreFront实现Store {
...


public interface Store {
...

当它部署时,它表示EJB绑定到:

 java:app / store-core-2011.1.2-SNAPSHOT / StoreFront
java:app / store-core -2011.1.2-SNAPSHOT / StoreFront!uk.co.magus.jam.store.core.Store
java:module / StoreFront
java:module / StoreFront!uk.co.magus .jam.store.core.Store
java:global / store-ear-2011.1.2-SNAPSHOT / store-core-2011.1.2-SNAPSHOT / StoreFront!uk.co.magus.jam.store。 core.Store
java:global / store-ear-2011.1.2-SNAPSHOT / store-core-2011.1.2-SNAPSHOT / St oreFront

到目前为止,这么好。当我尝试通过JNDI从非CDI中查找时,在其他部署的EAR中的JAR内的非EJB类,只能在全局下的JNDI名称上再次找到。



但是,当我尝试将生成的对象转换为实际的接口类时:

  Object lookupObject = new InitialContext()。lookup(jndiName); 
Store store =(StoreFront)lookupObject;

我收到以下异常:

  11:17:52,402 ERROR [jam.core.link.LinkListener](Thread-45)查找后转换为Store时的异常[java:global / store-ear-2011.1.2- SNAPSHOT / store-core-2011.1.2-SNAPSHOT / StoreFront]:java.lang.ClassCastException:jam.store.core.Store $$$ view1不能转为jam.store.core.Store 
卡住。 core.link.LinkListener.getStore(LinkListener.java:108)[core-jar-2011.1.2-SNAPSHOT.jar:]
在jam.core.link.LinkListener.postLoad(LinkListener.java:27)[ core-jar-2011.1.2-SNAPSHOT.jar:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.6.0_07]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl。 java:39)[:1.6.0_07]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)[:1.6.0_07]
在java.lang.reflect.Method.invoke Method.java:597)[:1.6.0_07]
在org.hibernate.ejb.event.Lis tenerCallback.invoke(ListenerCallback.java:48)
在org.hibernate.ejb.event.EntityCallbackHandler.callback(EntityCallbackHandler.java:96)
在org.hibernate.ejb.event.EntityCallbackHandler.postLoad( EntityCallbackHandler.java:89)
在org.hibernate.ejb.event.EJB3PostLoadEventListener.onPostLoad(EJB3PostLoadEventListener.java:49)
在org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java: 264)
在org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1012)
在org.hibernate.loader.Loader.doQuery(Loader.java:889)
在org .html.bat (Loader.java:2058)
在org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:81)
在org.hibernate.loader.entity.A bstractEntityLoader.load(AbstractEntityLoader.java:71)
在org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3686)
在org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource( DefaultLoadEventListener.java:446)
在org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:427)
在org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java: 204)
在org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:251)
在org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:148)
在org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:947)
在org.hibernate.internal.SessionImpl.get(SessionImpl.java:863)
在org.hibernate.internal .SessionImpl.get(SessionImpl.java:856)
在org.hibernate.ejb.AbstractEntityManagerImpl.fin d(AbstractEntityManagerImpl.java:787)
在org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:762)
在org.jboss.as.jpa.container.AbstractEntityManager.find(AbstractEntityManager。 java:220)[jboss-as-jpa-7.1.0.Alpha1-SNAPSHOT.jar:7.1.0.Alpha1-SNAPSHOT]
at jam.core.dao.GenericDAO.findById(GenericDAO.java:87) [core-jar-2011.1.2-SNAPSHOT.jar:]
在harvest.service.HarvesterDAOUtil.loadLink(HarvesterDAOUtil.java:251)[harvest-sar-2011.1.2-SNAPSHOT.jar:]
at harvest.service.1779224926 $ Proxy $ _ $$ _ WeldSubclass.loadLink(1779224926 $ Proxy $ _ $$ _ WeldSubclass.java)[harvest-sar-2011.1.2-SNAPSHOT.jar:]
at sun.reflect .NativeMethodAccessorImpl.invoke0(Native Method)[:1.6.0_07]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)[:1.6.0_07]
at sun.reflect.DelegatingMethodAccessorImpl。调用(DelegatingMethodMethodAccessorImpl.java:25)[:1.6.0_07]
在java.lang.reflect.Method.invoke (Method.java:597)[:1.6.0_07]
在org.jboss.interceptor.proxy.SimpleInterceptionChain.invokeNextInterceptor(SimpleInterceptionChain.java:112)[jboss-interceptor-core-2.0.0.Alpha3.jar :2.0.0.Alpha3]
在org.jboss.interceptor.proxy.InterceptorInvocationContext.proceed(InterceptorInvocationContext.java:119)[jboss-interceptor-core-2.0.0.Alpha3.jar:2.0.0.Alpha3 ]
在org.jboss.seam.transaction.TransactionInterceptor $ 1.work(TransactionInterceptor.java:194)[seam-persistence-3.0.0.Final.jar:]
在org.jboss.seam。 transaction.WorkInworkTransaction(Work.java:54)[seam-persistence-3.0.0.Final.jar:]
在org.jboss.seam.transaction.TransactionInterceptor.aroundInvoke(TransactionInterceptor.java:188)[ seam-persistence-3.0.0.Final.jar:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.6.0_07]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl。 java:39)[:1.6.0_07]
at sun.reflect.DelegatingMethodAcce ssorImpl.invoke(DelegatingMethodAccessorImpl.java:25)[:1.6.0_07]
在java.lang.reflect.Method.invoke(Method.java:597)[:1.6.0_07]
在org。 jboss.interceptor.proxy.InterceptorInvocation $ InterceptorMethodInvocation.invoke(InterceptorInvocation.java:72)[jboss-interceptor-core-2.0.0.Alpha3.jar:2.0.0.Alpha3]
在org.jboss.interceptor。 proxy.SimpleInterceptionChain.invokeNextInterceptor(SimpleInterceptionChain.java:82)[jboss-interceptor-core-2.0.0.Alpha3.jar:2.0.0.Alpha3]
在org.jboss.interceptor.proxy.InterceptorMethodHandler.executeInterception( InterceptorMethodHandler.java:133)[jboss-interceptor-core-2.0.0.Alpha3.jar:2.0.0.Alpha3]
在org.jboss.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:112) [jboss-interceptor-core-2.0.0.Alpha3.jar:2.0.0.Alpha3]
在org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:65)[weld-core -1。 1.2.Final.jar:2011-07-26 15:02]
在harvest.service.1779224926 $ Proxy $ _ $$ _ WeldSubclass.loadLink(1779224926 $ Proxy $ _ $$ _ WeldSubclass.java)[harvest-sar -2011.1.2-SNAPSHOT.jar:]
在harvest.service.CombineHarvester.workOnLinkId(CombineHarvester.java:259)[harvest-sar-2011.1.2-SNAPSHOT.jar:]
在收获。 service.CombineHarvester.harvestCache(CombineHarvester.java:223)[harvest-sar-2011.1.2-SNAPSHOT.jar:]
在harvest.service.CombineHarvester.performHarvest(CombineHarvester.java:136)[harvest-sar- 2011.1.2-SNAPSHOT.jar:]
在harvest.service.CombineHarvester.run(CombineHarvester.java:107)[harvest-sar-2011.1.2-SNAPSHOT.jar:]
在java.lang .Thread.run(Thread.java:619)[:1.6.0_07]

EJB是否注释一个来自

  @Local(Store.class)
@Remote(Store.class)
@LocalBean

没有区别。据我所知,它返回代理视图的事实是正常的。但是,我不应该将该视图投射到界面?我使用的全球JNDI名称的组合以及我是否投放到Store或StoreFront也似乎没有区别 - 即使异常类似于 jam.store.core.Store $$$ view1不能被转换为jam.store.core.Store ,匹配(基础)类名称



有人可以指出什么我在做错了?

解决方案

这是AS7中的一个错误: https://issues.jboss.org/browse/AS7-1658



一个可能的解决方法是不要转换返回的对象,然后使用它通过反射。笨拙的。


I have am deploying 2 EARs onto JBoss AS 7.1.0.Alpha1-SNAPSHOT (post 7.0.1.Final version). Both deploy fine.

I have an EJB Singleton class packaged within a JAR, within one of the EARs:

@Startup
@Singleton
// one of @Local(Store.class), @Remote(Store.class), @LocalBean
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
@Transactional(TransactionPropagation.SUPPORTS)
public class StoreFront implements Store {
...


public interface Store {
...

When it deploys, it says the EJB is bound to:

"java:app/store-core-2011.1.2-SNAPSHOT/StoreFront"
"java:app/store-core-2011.1.2-SNAPSHOT/StoreFront!uk.co.magus.jam.store.core.Store"
"java:module/StoreFront"
"java:module/StoreFront!uk.co.magus.jam.store.core.Store"
"java:global/store-ear-2011.1.2-SNAPSHOT/store-core-2011.1.2-SNAPSHOT/StoreFront!uk.co.magus.jam.store.core.Store"
"java:global/store-ear-2011.1.2-SNAPSHOT/store-core-2011.1.2-SNAPSHOT/StoreFront"

So far, so good. When I try to look it up via JNDI from a non-CDI, non-EJB class within a JAR within the OTHER deployed EAR, it can only be found on the JNDI names under 'global' - again, expected.

However, when I try to cast the resulting object to the actual interface class:

Object lookupObject = new InitialContext().lookup(jndiName);
Store store = (StoreFront)lookupObject;

I get the following exception:

11:17:52,402 ERROR [jam.core.link.LinkListener] (Thread-45) Exception when casting to Store after lookup with [java:global/store-ear-2011.1.2-SNAPSHOT/store-core-2011.1.2-SNAPSHOT/StoreFront]: java.lang.ClassCastException: jam.store.core.Store$$$view1 cannot be cast to jam.store.core.Store
    at jam.core.link.LinkListener.getStore(LinkListener.java:108) [core-jar-2011.1.2-SNAPSHOT.jar:]
    at jam.core.link.LinkListener.postLoad(LinkListener.java:27) [core-jar-2011.1.2-SNAPSHOT.jar:]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_07]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_07]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_07]
    at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_07]
    at org.hibernate.ejb.event.ListenerCallback.invoke(ListenerCallback.java:48)
    at org.hibernate.ejb.event.EntityCallbackHandler.callback(EntityCallbackHandler.java:96)
    at org.hibernate.ejb.event.EntityCallbackHandler.postLoad(EntityCallbackHandler.java:89)
    at org.hibernate.ejb.event.EJB3PostLoadEventListener.onPostLoad(EJB3PostLoadEventListener.java:49)
    at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:264)
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1012)
    at org.hibernate.loader.Loader.doQuery(Loader.java:889)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
    at org.hibernate.loader.Loader.loadEntity(Loader.java:2058)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:81)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71)
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3686)
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:446)
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:427)
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:204)
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:251)
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:148)
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:947)
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:863)
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:856)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:787)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:762)
    at org.jboss.as.jpa.container.AbstractEntityManager.find(AbstractEntityManager.java:220) [jboss-as-jpa-7.1.0.Alpha1-SNAPSHOT.jar:7.1.0.Alpha1-SNAPSHOT]
    at jam.core.dao.GenericDAO.findById(GenericDAO.java:87) [core-jar-2011.1.2-SNAPSHOT.jar:]
    at harvest.service.HarvesterDAOUtil.loadLink(HarvesterDAOUtil.java:251) [harvest-sar-2011.1.2-SNAPSHOT.jar:]
    at harvest.service.1779224926$Proxy$_$$_WeldSubclass.loadLink(1779224926$Proxy$_$$_WeldSubclass.java) [harvest-sar-2011.1.2-SNAPSHOT.jar:]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_07]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_07]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_07]
    at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_07]
    at org.jboss.interceptor.proxy.SimpleInterceptionChain.invokeNextInterceptor(SimpleInterceptionChain.java:112) [jboss-interceptor-core-2.0.0.Alpha3.jar:2.0.0.Alpha3]
    at org.jboss.interceptor.proxy.InterceptorInvocationContext.proceed(InterceptorInvocationContext.java:119) [jboss-interceptor-core-2.0.0.Alpha3.jar:2.0.0.Alpha3]
    at org.jboss.seam.transaction.TransactionInterceptor$1.work(TransactionInterceptor.java:194) [seam-persistence-3.0.0.Final.jar:]
    at org.jboss.seam.transaction.Work.workInTransaction(Work.java:54) [seam-persistence-3.0.0.Final.jar:]
    at org.jboss.seam.transaction.TransactionInterceptor.aroundInvoke(TransactionInterceptor.java:188) [seam-persistence-3.0.0.Final.jar:]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_07]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_07]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_07]
    at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_07]
    at org.jboss.interceptor.proxy.InterceptorInvocation$InterceptorMethodInvocation.invoke(InterceptorInvocation.java:72) [jboss-interceptor-core-2.0.0.Alpha3.jar:2.0.0.Alpha3]
    at org.jboss.interceptor.proxy.SimpleInterceptionChain.invokeNextInterceptor(SimpleInterceptionChain.java:82) [jboss-interceptor-core-2.0.0.Alpha3.jar:2.0.0.Alpha3]
    at org.jboss.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:133) [jboss-interceptor-core-2.0.0.Alpha3.jar:2.0.0.Alpha3]
    at org.jboss.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:112) [jboss-interceptor-core-2.0.0.Alpha3.jar:2.0.0.Alpha3]
    at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:65) [weld-core-1.1.2.Final.jar:2011-07-26 15:02]
    at harvest.service.1779224926$Proxy$_$$_WeldSubclass.loadLink(1779224926$Proxy$_$$_WeldSubclass.java) [harvest-sar-2011.1.2-SNAPSHOT.jar:]
    at harvest.service.CombineHarvester.workOnLinkId(CombineHarvester.java:259) [harvest-sar-2011.1.2-SNAPSHOT.jar:]
    at harvest.service.CombineHarvester.harvestCache(CombineHarvester.java:223) [harvest-sar-2011.1.2-SNAPSHOT.jar:]
    at harvest.service.CombineHarvester.performHarvest(CombineHarvester.java:136) [harvest-sar-2011.1.2-SNAPSHOT.jar:]
    at harvest.service.CombineHarvester.run(CombineHarvester.java:107) [harvest-sar-2011.1.2-SNAPSHOT.jar:]
    at java.lang.Thread.run(Thread.java:619) [:1.6.0_07]

Whether the EJB is annotated with one from any of

@Local(Store.class)
@Remote(Store.class)
@LocalBean 

makes no difference. As I understand it, the fact it's returning a proxy 'view' is normal. However, shouldn't I be able to cast that view to the interface? The combination of which global JNDI name I use and whether I cast to Store or StoreFront also appears to make no difference - unable to cast whatever the combination, even when the exception is like jam.store.core.Store$$$view1 cannot be cast to jam.store.core.Store, with matching (base) class names

Can anyone point out what I'm doing wrong?

解决方案

This is a bug in AS7: https://issues.jboss.org/browse/AS7-1658

One possible workaround is not to cast the returned object, and then use it to fire methods via reflection. Well clunky though.

这篇关于在AS7中调用查询EJB视图时,ClassCastException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆