2012-02-10 13 views
2

クライアント側のGWT/RequestFactoryと、サーバー側のWebLogic上のJPA/EclipseLinkに基づいて、GWTアプリケーションを設定しています。WebLogic上でGWT/RequestFactoryを使用したClassCastException

しかし、開発中にサーバー側コード(エンティティ、DAO、またはJavaファイル内のコメントでもよい)で何かを変更するたびに、私はClassCastExceptionを2つの明らかに類似したクラスの間で取得します。私は自分のアプリケーションを使用しようとしています。それを取り除く唯一の方法は、WebLogic Serverを再起動することです。アプリケーションを再デプロイしても役立たない。

2012年2月10日午前4時08分10秒PM SEVERE com.google.web.bindery.requestfactory.server.RequestFactoryServlet のdoPost:予期しないエラーjava.lang.ClassCastExceptionが: com.mycompany.MyClassをすることはできません com.google.web.bindery.requestfactory.server.LocatorServiceLayer.doGetId(LocatorServiceLayer.javaで com.mycompany.server.locator.CodeLevelLocator.getId(MyClassLocator.java:1) でcom.mycompany.MyClassにキャスト: 168) at com.google.web.bindery.requestfactory.server.LocatorServiceLayer.getId(LocatorServiceLayer.java:66) at com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.getId(ServiceLayerDecorator.java:81)

このサーバの再起動を回避するために、どのように任意のアイデア?

ありがとうございました。

EDIT:私はこれに対して奨励金を設定しています。各サーバーの変更後にWebLogicを再起動すると、本当に苦しいです!

public class DeploymentListener implements ServletContextListener { 

    private static Logger log = LoggerFactory 
      .getLogger(DeploymentListener.class.getName()); 

    @Override 
    public void contextDestroyed(ServletContextEvent arg0) { 

     try { 
      // close the Entity Manager Factory. 
      EMF.close(); 
     } catch (Exception e) { 
      log.error("Error closing the Entity Manager Factory", e); 
     } 
    } 

    @Override 
    public void contextInitialized(ServletContextEvent arg0) { 
     // nothing to do 
    } 

} 
+2

私は本当に答える資格はありませんが、私はこれを提案することができます:エラーは、クラスローダーの問題のように見えます。ここで、jvmは2つのクラスローダーの同じクラスに対して2つの異なる宣言を持つようです。 。ほとんどのサーブレットコンテナは、アプリを相互に隔離したままにし、アプリを再デプロイできるように特別なクラスローダーを使用しています。私の推測では、これはあなたのケースでは正しく機能していないということです。 –

+0

ヒントをお寄せいただきありがとうございますが、ここには[GWT/RequestFactory](http://code.google.com/webtoolkit/doc/latest/DevGuideRequestFactory.html)固有のものがあると思います。おそらく、ここのGWTのユーザーがこの問題を抱えているのでしょうか? – foch

+0

私は実際にGWT開発者であり、私のプロジェクトのほとんどでRFを使用していますが、その提案を提供するには十分なクラスローダーの問題を知っています。私はJettyやTomcatにRFクラスを再デプロイする際にその問題を見たことはありません。 –

答えて

2

これはクラスローダーの問題です。再デプロイ後に、古いクラス/インスタンスがアプリケーションのどこかに残っています。

JPAに関連している可能性があります。コンテナ管理の永続性ユニットを使用していますか、アプリケーションを管理していますか? Container managedはこの問題を起こすべきではありませんが、古いEntityManagerFactoryを閉じるのではなく、古いクラスを残すことができるようにアプリケーションを管理することができます。再デプロイする前にすべてのファクトリを閉じるか、またはコンテナ管理で問題が解決したかどうかを確認してください。

+0

素晴らしい、それは動作します!私はアプリケーション管理の永続性を使用していますので、工場を閉じるためにリスナーを追加しました。それはうまく費やされた50の担当者だった、ありがとう:) – foch

0

ないWebLogicでGWTを実行しているに精通したが、おそらくこれが役立ちます。次のServletContextListenerを追加することによって、ジェームズのおかげで解決し

EDIT2

サーバーをデバッグモードで実行します。実行時にクラス/ jarの変更を取得できるはずです。

おそらく、サーバーを再起動するのではなく、サーバーを再公開する必要があります。

最後に、クラスパスの別の場所にあるjarファイルにそのクラスがありますか?

関連する問題