ClassCastException nach JDNI Lockup

Dieses Thema ClassCastException nach JDNI Lockup im Forum "Application Tier" wurde erstellt von JogiBär, 3. Nov. 2012.

Thema: ClassCastException nach JDNI Lockup Hi Folks, ich habe auf einem Glassfish-Server (3.1.2) zwei Projekte deployed. Ein EJB Projekt, welches für meine...

  1. Hi Folks,

    ich habe auf einem Glassfish-Server (3.1.2) zwei Projekte deployed. Ein EJB Projekt, welches für meine Logik und Datenhaltung zuständig sein soll und ein DynmicWebProject für die GUI.

    Das EJB Projket habe ich im Build Path hinzugefügt.
    [​IMG]

    Innerhalb des EJB Projektes habe ich eine SessionBean:

    Code (Java):

    /**
     * Session Bean implementation class ClientManagementBean
     */

    @Singleton
    @LocalBean
    public class ClientManagementBean{

        /**
         * Default constructor.
         */

        public ClientManagementBean() {
            // TODO Auto-generated constructor stub
        }

     // internal stack
        private List<UserClient> clients = new ArrayList<UserClient>();
    ...
     
    mit entsprechendem Business-Interface definiert:
    Code (Java):


    @Remote
    public interface ClientManagementBeanRemote{

        public void addClient(UserClient client);
        ...
     
    Nun möchte ich im WebProjekt auf diese Klasse zugreifen. Hierzu habe ich folgenden Code geschrieben:
    Code (Java):

    Properties props = new Properties();

                props.setProperty("java.naming.factory.initial",
                        "com.sun.enterprise.naming.SerialInitContextFactory");

                props.setProperty("java.naming.factory.url.pkgs",
                        "com.sun.enterprise.naming");

                props.setProperty("java.naming.factory.state",
                        "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");

                Context context = new InitialContext(props);

                Object initObj = context
                        .lookup("ClientManagementBean");
                ClientManagementBean clientManager = (ClientManagementBean) initObj;
     
    Der Lockup funktioniert auch und gibt mir ein entsprechendes Objekt zurück. Mein Problem besteht nun im nachfolgenden Cast:
    Code (Text):
    ClientManagementBean clientManager = (ClientManagementBean) initObj;).
    Dieser verursachte zunächst einmal "java.lang.NoClassDefFoundError: logic/mgntBeans/ClientManagementBean". Daraufhin habe ich das EJB project als EJB jar exportiert und im WebProjekt unter WEB-INF/lib/ hinzugefügt. Nun bekomme ich jedoch eine ClassCastException:

    Code (Text):

    java.lang.ClassCastException: logic.mgntBeans.__EJB31_Generated__ClientManagementBean__Intf____Bean__ cannot be cast to logic.mgntBeans.ClientManagementBean
     
    Nach einiger Recherche habe ich noch im Classpath die gf-client.jar hinzugefügt, was jedoch zu keiner Verbesserung führte.

    [​IMG]

    Nun meine Fragen:
    - Was habe ich falsch gemacht, das der Cast nicht funktioniert?
    - Gibt es eine bessere Methode das ClassNotFound Problem zu umgehen. Aktuell muss ich bei jeder neuen vedion die jar im WebProjket aktuallisieren. Gibt es hierzu eine automatisierung?

    Vielen Dank im Vorruas
    JogiBär
     
  2. Vielleicht hilft dir das Java-Tutorial weiter. Hier klicken --> (Klick)
  3. Hi,

    konnte das Problem lösen, indem ich ein EnterpriseApplicationProjekt angelegt habe und die beiden Projkete diesem zugeordnet habe.

    Gruß
    Jogibär
     
  4. Vermutlich hast du das Problem nur scheinbar gelöst, denn du kannst immer noch nicht erklären, wie hier eine ClassCastException entstehen kann.

    Ohne mit Glassfish bisher viel gearbeitet zu haben, vermute ich dass es sich hier wie bei anderen AS verhält: abhängig vom Assembly und von der Konfiguration (WAR, EAR) wird das Classloading im AS anders realisiert. Genaus kann man nur herausfinden, wenn man weiß wie der AS dort arbeitet und wie deine Applikation genau gepackt ist.
     
  5. Schau dir jetzt hier den Kurs an und lernen Java zu programmieren: --> Hier klicken, um mehr zu erfahren (Klick)