Search the FirstSpirit Knowledge Base
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.
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 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.