2011-09-01 8 views
9

2つのEARをJBoss AS 7.1.0.Alpha1-SNAPSHOT(7.0.1以降の最終バージョン)にデプロイしています。どちらもうまく展開します。それは、EJBがバインドされていると言い、ClassCastExceptionはAS7でルックアップされたEJBビューをキャストする場合

@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 { 
... 

それが配備:

I耳の1つにJAR内にパッケージされた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/StoreFront" 

、とても良い。私は、他のデプロイされたEAR内のJAR内の非CDI、非EJBクラスからJNDI経由でそれを調べようとすると、JNDI名のみで 'グローバル'の下にしか見つかりませんでした。しかし

、私は実際のインタフェースクラスに結果のオブジェクトをキャストしようとすると:EJBは、のいずれかから1でアノテートされているかどうか

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] 

:私は、次の例外を取得

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

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

は違いがありません。私が理解しているように、それはプロキシのビューを返すという事実は正常です。しかし、そのビューをインターフェイスにキャストすることはできませんか?私が使用するグローバルJNDI名とStoreまたはStoreFrontにキャストするかどうかは、違いがないように見えます。たとえ例外がjam.store.core.Store$$$view1 cannot be cast to jam.store.core.Storeのようなものであっても、(ベース)クラス名が一致する場合でもキャストできません。

誰かが間違っていることを指摘できますか?

答えて

8

これはAS7のバグです:https://issues.jboss.org/browse/AS7-1658

一つの可能​​な回避策はreflection経由でメソッドを発射するためにそれを使用し、その後、返されたオブジェクトをキャストすることはない、と。しかし、うんざり。

4

より良いアプローチは、(Mavenを使用する場合)とのJBossモジュールで共有インターフェースを展開し、両方のアーティファクトクラスパスにそのモジュールを含むことがある

   <archive> 
        <manifestEntries> 
         <Dependencies>${jboss.nonjee.modules}</Dependencies> 
        </manifestEntries> 
       </archive> 
+0

ああ、私はそれを実現しませんでした。現在のところ私たちのための選択肢ではありませんが、大きなポイントです。 –

3

また、私はこの解説のヘルプを得る;):

David Lloydさんがコメントを追加しました - 07/Mar/12 4:02 PM あなたがローカルインターフェイスを使用しているからです。ローカルインターフェイスを使用する場合、インターフェイスクラスのコピーを1つだけ持つことができます(これがローカルになります)。リモートインターフェイスを使用するように切り替えます(または、Class-Pathを使用してローカルインターフェイスを複製するのではなく)。問題は消えるはずです。

2

私は同じ問題を抱えていました。 InterfaceクラスをSperateモジュールとして1つのEarに組み込み、もう1つのEarで提供するようにしました。 JBOSSでは、各EARのクラスは別々のクラスローダによってロードされます。したがって、あるEARがクラスAを持ち、別のEARが同じクラスAを持つ場合、クラスキャスト例外が発生します。したがって、2番目のEARでは、提供された依存関係を与え、jboss-deployment-structure.xmlに最初のEARをモジュール依存として追加します。動的モジュールの依存性により、EARファイル名が一定であることが保証されることに注意してください。

//jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 

TO 
    jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.naming.remote.client.InitialContextFactory"); 

モジュールの両方に以下を参照してください、とのインタフェースを含むMavenのモジュールが含まれて - あなたはこの

はまたローカルからリモートへの参照を変更し修正するためにEARファイルのビルドタグの下<finalName>を指定することができますそして、あなたはJavaから検索を変更したいと思う:Javaへのアプリ:グローバル

final javax.naming.Context context = new InitialContext(jndiProperties); 
     AsyncFutureItf test =(AsyncFutureItf)context.lookup 
       //("java:app/Executor/AsyncFutureTest!pacakge.AsyncFutureItf"); 
       ("java:global/ExecutorEar/Executor/AsyncFutureTest!package.AsyncFutureItf"); 

と耳は通常、この

のようなバージョンに登録されているので、
java:global/ExecutorEar-<version>/Executor/AsyncFutureTest!package.AsyncFutureItf 

コードでバージョン駆動型の検索をしたくない場合は、もう2つのことを行う必要があります。あなたのEARであなたのapplication.xmlのビルダーMavenのディレクトリ(SRC \メイン\リソース\ application.xmlに)あなたがポンポンを生成する

<?xml version="1.0" encoding="UTF-8"?> 
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd" version="5"> 
    <description>Task Controller EAR</description> 
    <display-name>TaskControllerEAR</display-name> 
    <application-name>TaskControllerEAR</application-name> 
    <module> 
    <ejb>TaskController.jar</ejb> 
    </module> 
    <library-directory>lib</library-directory> 
</application> 

ようにし、あなたのポンポンで、「アプリケーション名」のタグを追加する必要があります

<groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-ear-plugin</artifactId> 
      <version>2.4.2</version> 
      <configuration> 
       <version>5</version> 
       <defaultLibBundleDir>lib</defaultLibBundleDir> 
       <earSourceDirectory>src/main/resources</earSourceDirectory> 
       <applicationXml>${project.basedir}/src/main/resources/application.xml</applicationXml> 

のようなのapplication.xmlへの参照を提供する必要があります...

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> 
     <ear-subdeployments-isolated>false</ear-subdeployments-isolated> 


     <sub-deployment name="MROControllerRest.war"> 
       <exclusions> 
          <module name="org.apache.commons.logging" /> 
          <module name="org.slf4j" /> 
          <module name="org.slf4j.ext" /> 
          <module name="org.slf4j.jcl-over-slf4j" /> 
          <module name="org.slf4j.impl" /> 
          <module name="org.apache.log4j" /> 
       </exclusions> 
       <dependencies> 
        <module name="org.slf4j" slot="1.7.5" /> 
        <module name="logger" /> 
        <module name="deployment.TaskControllerEAR.ear.TaskController.jar" export="TRUE"/> 

       </dependencies> 

ここでは、参照

java.lang.ClassCastException: com.package.TaskSplitterItf$$$view210 cannot be cast to com.package.TaskSplitterItf 
+0

Webモジュールのpomファイルでejbモジュールの依存スコープを「提供」に変更すると、クラスキャスト例外の問題が解決されました。ありがとうございました。 – EmeraldTablet

1

同じ問題もあなたのEJBクライアントは、EARと別の「サービス」-earでEJBの実装であり、そしてあなたが@Remoteインターフェイスメソッドを呼び出す場合のスタックトレースですEJBはプリミティブ型ではなく複雑なObjectを返します。返される複合オブジェクトは、インタフェースとして宣言され、適切に宣言され、既知であり、EJBクライアントで使用可能です。返されるObjectの実装は、それも、ターゲットのEJB実装とともに「サービス」-EARに含まれています。 準拠コードにもかかわらず、JBossはクラスキャスト例外で失敗します。

ターゲットのEJBメソッドをすべて宣言するために@Remoteインターフェイスを使用できますが、それらのメソッドから返されるすべてのオブジェクトに対してプレーンクラス宣言しか使用できないことに注意しました。返されたオブジェクトをインタフェースとして宣言すると、クラスキャスト例外がJBossで発生します。

これはJBossの制限(またはバグ)です。 GlassfishとWebLogicで動作します。GlassfishとWebLogicは、同じコードを実行しています。

1

同じ問題が発生したのは、EARでEJBを使用するjarファイルが1回だけある場合です。

サンプル:

あなたは

  • ウェブクラス/リソースが含まれているあなたのEJBのすべて
  • MyWebApp.warの
  • myEnterprise.earが含まれているmyEJB.jarファイルを持っていますmyEJB.jarとmyWebApp.jarが含まれています

myWebAppの場合は、warには自分自身でmyEJB.jarが含まれている場合、このエラー(ClassCastExc)が発生します。 EJBオブジェクトがmyEnterprise.earのmyEJB.jarの内部に作成されているようです。そして、このオブジェクトをmyWebApp.warのmyEJB.jarの同じクラスにキャストすると、これはクラスが別のjarで定義されているため機能しません。

このエラーが発生している場合は、あなたのwarファイルからmyEJB.jarを削除する必要がありますし、ClassCastExcがなくなって...

関連する問題