phillip_austerf
New Creator

Service Cast Exception

Jump to solution

Hallo zusammen,

ich habe eine Frage bzgl. eines Services. Zwar habe ich in div. Einträgen schonmal das Thema angeschnitten gesehen, jedoch komme ich damit nicht weiter.

Die Ausgangslage ist ganz einfach. Ich öffne mittels API eine Connection zu FS. Danach möchte ich mir einen Service holen. Der Service läuft auch korrekt, ich kann die Konfigurations-Gui des Services im Servermanager laden.

Wenn ich aber mit dem Service arbeiten will, dann knallts.

connection.getService("MyService");

Dieser Aufruf gelingt, das Ergebnis ist nicht null.

Wenn ich jedoch den Service selbst holen will mittels

MyServiceImpl x = (MyServiceImpl) c.getService("MyService");

dann bekomme ich eine Exception:

com.sun.proxy.$Proxy18 cannot be cast to de.espirit.firstspirit.opt.examples.service.MyServiceImpl

Den Server habe ich bereits neu gestartet. Die Modules-XML Components-Einträge des Service sagen folgendes:

<components>

        <service>

            <name>MyService</name>

            <description>A Service example implemenation</description>

            <class>de.espirit.firstspirit.opt.examples.service.MyServiceImpl</class>

            <configurable>de.espirit.firstspirit.opt.examples.service.MyServiceConfigPanel</configurable>

            <resources>

                <resource name="myservicelib">lib/${project.artifactId}-${project.version}-jar-with-dependencies.jar</resource>

                <resource>META-INF/my-service.conf</resource>

            </resources>

        </service>

    </components>

Ich nutze FS 5.1.

Wo liegt mein Fehler?

Viele Grüße,

Phillip.

1 Solution

Accepted Solutions
bIT_sosswald
Returning Responder

Hallo Philip,

dein Code sieht erst einmal gut aus.

Ich persönlich hole mir meine Services meistens in einem Executable (da ich damit die Services in meinen Modulen starten will) über einen ServicesBroker.

ServicesBroker servicesBroker = context.requestSpecialist(ServicesBroker.TYPE);

MyService service = servicesBroker.getService(MyService.class);

Dabei gehe ich nicht über den Namend es Services, sondern über dessen Klasse bzw. Interface. Dazu muss der Service die folgende Methode implementieren und das Interface deines Services zurückgeben.

@Override

public Class<MyService> getServiceInterface() {

     return MyService.class;

}

So wie ich es gesehen habe, bietet auch die Connection eine Methode, mit der man einen Service über sein Interface anfragen kann. (Diese ist sogar von ServicesBroker geerbt.)

Vielleicht hilft das ja weiter.

Ansonsten hilft es manchmal auch den Service selbst neu zu starten. Ein Neustart des ganzen Servers ist dazu eigentlich nicht notwedig.

Grüße

Sandro

View solution in original post

2 Replies
bIT_sosswald
Returning Responder

Hallo Philip,

dein Code sieht erst einmal gut aus.

Ich persönlich hole mir meine Services meistens in einem Executable (da ich damit die Services in meinen Modulen starten will) über einen ServicesBroker.

ServicesBroker servicesBroker = context.requestSpecialist(ServicesBroker.TYPE);

MyService service = servicesBroker.getService(MyService.class);

Dabei gehe ich nicht über den Namend es Services, sondern über dessen Klasse bzw. Interface. Dazu muss der Service die folgende Methode implementieren und das Interface deines Services zurückgeben.

@Override

public Class<MyService> getServiceInterface() {

     return MyService.class;

}

So wie ich es gesehen habe, bietet auch die Connection eine Methode, mit der man einen Service über sein Interface anfragen kann. (Diese ist sogar von ServicesBroker geerbt.)

Vielleicht hilft das ja weiter.

Ansonsten hilft es manchmal auch den Service selbst neu zu starten. Ein Neustart des ganzen Servers ist dazu eigentlich nicht notwedig.

Grüße

Sandro

Hallo Sandro,

Danke für die Info. Es klappt nun.

Gruß,

Phillip.

0 Kudos