Questions & Answers

SOLVED
Josef_Awad
I'm new here

Aufruf eines fremden Services: ClassCastException

Jump to solution

Hallo Zusammen,

ich versuche verzweifelt aus meinem Modul (Service) einen Service eines Drittanbieters mit Hilfe der getService("ServiceName") aufzurufen:

FremdServiceProxy service =  (FremdServiceProxy) this._environment.getConnection().getService("Fremd Service");

Leider erhalte ich immer folgende ClassCastException:

java.lang.ClassCastException: com.fremdFirma.fsmodule.FremdServiceProxy cannot be cast to com.fremdFirma.fsmodule.FremdServiceProxy

at com.meineFirma.modul.FsSceletonService.process(FsSceletonService.java:59)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at de.espirit.firstspirit.server.module.ServiceWrapperImpl.invoke(ServiceWrapperImpl.java:90)

at $Proxy35.process(Unknown Source)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at de.espirit.firstspirit.io.DefaultServerHandler.callManager(DefaultServerHandler.java:62)

at de.espirit.firstspirit.server.io.handler.ManagerCall.doCall(ManagerCall.java:91)

at de.espirit.firstspirit.server.io.handler.ManagerCall.handle(ManagerCall.java:67)

at de.espirit.firstspirit.server.io.ManagerCallWorker.run(ManagerCallWorker.java:108)

at de.espirit.firstspirit.server.ExecutionManagerImpl$RunnableWrapper.call(ExecutionManagerImpl.java:553)

at de.espirit.firstspirit.server.ExecutionManagerImpl$ExtendedCallable.call(ExecutionManagerImpl.java:520)

at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)

at java.util.concurrent.FutureTask.run(FutureTask.java:138)

at de.espirit.common.util.BoundedExecutorService$RunnableWrapper.run(BoundedExecutorService.java:419)

at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)

at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)

at java.util.concurrent.FutureTask.run(FutureTask.java:138)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

at java.lang.Thread.run(Thread.java:662)

at de.espirit.common.util.SuspendableThread.run(SuspendableThread.java:36)

Im Modul Developer Document finde ich zwar unter 2.10.2 einen Hinweis auf eine mรถgliche Ursache, allerdings bin ich mir nicht Sicher ob a) das Beispiel auch meinen Fall abdeckt und b) wie die angegebene Lรถsung fรผr meinen Fall aussieht.

Benutzte FS Version: 4.2.461.48921

Hat hier jemand einen Tipp fรผr mich? Danke im Voraus!

1 Solution

Accepted Solutions

FremdServiceProxy  existiert auch nur einmal, d.h. in einem jar?

habe sie den fs-server mal neugestartet?

schauen sie mal auf dem server in das data/modules verzeichnis...sind dort mehrere "alte" *jars/*.fsm's ihres moduls vorhanden? wenn ja, mal alle loschen und das modul neu installieren

definieren Sie die Dienste mal so:

<?xml version="1.0" encoding="UTF-8"?>

<module>

    <name>MeinModul</name>

    <version>0.1</version>

    <description>-</description>

    <vendor>meineFirma</vendor>

    <components>

        <service>

            <name>Mein Service</name>

            <description>-</description>

            <class>com.meineFirma.modul.FsSceletonService</class>

          </service>

    </components>

<resources>

    <resource>lib/mein_service.jar</resource>

   </resources>

</module>

View solution in original post

0 Kudos
7 Replies
stephan
I'm new here

Hallo,

das Problem sollte in der Tat durch unterschiedliche Classloader verursacht werden. Wie sieht denn die module.xml aus und wie ist die Dateistruktur des Moduls?

Viele GrรผรŸe

J. Stephan

Hallo Herr Stephan,

die module.xml's & Dateistrukturen sehen wie folgt aus:

Mein Modul:

module.xml:

<?xml version="1.0" encoding="UTF-8"?>

<module>

    <name>MeinModul</name>

    <version>0.1</version>

    <description>-</description>

    <vendor>meineFirma</vendor>

    <components>

        <service>

            <name>Mein Service</name>

            <description>-</description>

            <class>com.meineFirma.modul.FsSceletonService</class>

   <resources>

    <resource>lib/mein_service.jar</resource>

   </resources>

        </service>

    </components>

</module>

Dateistruktur (MeinModul.fsm):

lib/

lib/mein_service.jar

META_INF/

META_INF/INDEX.LIST

META_INF/MANIFEST.MF

META_INF/module.xml

Fremd Modul:

module.xml:

<!DOCTYPE module SYSTEM "../../../server/module.dtd">

<module>

  <name>FremdModul</name>

  <version>9.9</version>

  <description>-</description>

  <vendor>fremdFirma</vendor>

  <components>

<service>

     <name>Fremd Service</name>

     <description>-</description>

     <configurable>com.fremdFirma.fsmodule.FremdServiceConfiguration</configurable>

     <class>com.fremdFirma.fsmodule.FremdServiceServiceImpl</class>

  <resources>

   <resource>libs/FremdService0.jar</resource>

   <resource>libs/FremdService1.jar</resource>

   <resource>libs/FremdService2.jar</resource>

     </resources>

</service>

  </components>

</module>

Dateistruktur (FremdModul.fsm):

libs/

libs/FremdService0.jar

libs/FremdService1.jar

libs/FremdService2.jar

META_INF/

META_INF/module.xml

Danke fรผr Ihre Unterstรผtzung!

Viele GrรผรŸe,

Josef Awad

0 Kudos

Hat keiner hier eine Idee?

0 Kudos

Hallo,

so direkt kann ich an ihren Daten auch keinen Fehler feststellen. Es kรถnnte zu Problemen kommen wenn in einem der Jars des Fremdmoduls eine Klasse existiert, die sie im Jar Ihres Moduls auch verwenden - dazu mรผsste man in die Jars schauen.

Alternativ kรถnnten sie es auch mal ohne Cast probieren:

FremdServiceProxy service = this._environment.getConnection().getService("Fremd Service");

Viele GrรผรŸe

J. Stephan

0 Kudos

Hallo,

danke fรผr die Antwort, ich habe beides versucht:

1. Ich habe einfach alle meine Klassen um ein eindeutiges Kรผrzel erweitert, leider ohne Erfolg

2. Leider liefert die Methode getService ein Object zurรผck dass ich auf den FremdServiceProxy Casten muss um Methoden des Services nutzen zu kรถnnen -> kein Erfolg

Leider erscheint mir die Aussage der Dokumentation widersprรผchlich, wenn Services zwar immer als global verfรผgbar deklariert werden aber dann doch von unterschiedlichen Classloadern geladen werden und somit nicht untereinander kommunizieren kรถnnen.

Wie kann man dieses Problem vermeiden?

0 Kudos

FremdServiceProxy  existiert auch nur einmal, d.h. in einem jar?

habe sie den fs-server mal neugestartet?

schauen sie mal auf dem server in das data/modules verzeichnis...sind dort mehrere "alte" *jars/*.fsm's ihres moduls vorhanden? wenn ja, mal alle loschen und das modul neu installieren

definieren Sie die Dienste mal so:

<?xml version="1.0" encoding="UTF-8"?>

<module>

    <name>MeinModul</name>

    <version>0.1</version>

    <description>-</description>

    <vendor>meineFirma</vendor>

    <components>

        <service>

            <name>Mein Service</name>

            <description>-</description>

            <class>com.meineFirma.modul.FsSceletonService</class>

          </service>

    </components>

<resources>

    <resource>lib/mein_service.jar</resource>

   </resources>

</module>

0 Kudos

Hallo Zusammen,

das war die Lรถsung!

Fรผr mein Verstรคndnis: Bedeutet eine Ressourcendeklaration innerhalb der Service Tags in der module.xml, dass diese Ressource nicht mit demselben Classloader geladen werden wie diejenigen die auรŸerhalb der Service Tags deklariert werden? Das sollte in der Dokumentation noch ergรคnzt werden (sofern ich das nicht รผberlesen habe).

Vielen Dank fรผr die Geduld und Hilfe!

Viele GrรผรŸe,

Josef Awad

P.S. Der Cast auf den FremdServiceProxy war notwenig

0 Kudos

Type a product name