4.2.5. ClassCastExceptions のデバッグと解決

ClassCastExceptions は、拡張するクラスではなく他のクラスによってクラスがロードされるときに発生することが多くあります。また、同じクラスが複数の JAR に存在することが原因である場合もあります。
  1. ClassCastException によって名前付けされたクラスが含まれる JAR をすべて見つけるため、アプリケーションを検索します。クラスに対して定義されたモジュールがある場合、アプリケーションの WAR や EAR から重複する JAR を探し、削除します。
  2. クラスが含まれる JBoss モジュールを探し、MANIFEST.MF ファイルまたは jboss-deployment-structure.xml ファイルに依存関係を明示的に定義します。詳細については、https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『開発ガイド』の章「クラスローディングとモジュール」の「クラスローディングとサブデプロイメント」を参照してください。
  3. 上記の手順に従っても解決されない場合、クラスローダーの情報をログに出力すると問題の原因を判断できることがあります。たとえば、次の ClassCastException がログに記録されているとします。
    java.lang.ClassCastException: com.example1.CustomClass1 cannot be cast to com.example2.CustomClass2
    1. コードで ClassCastException によって命名されたクラスに対するクラスローダーの情報をログに出力します。例は次のとおりです。
      logger.info("Class loader for CustomClass1: " + 
            com.example1.CustomClass1.getClass().getClassLoader().toString());
      logger.info("Class loader for CustomClass2: " + 
            com.example2.CustomClass2.getClass().getClassLoader().toString());
      
    2. ログの情報には、どのモジュールがクラスをロードするかが記載されています。アプリケーションに基づき、競合する JAR を削除または移動する必要があります。