Foren

Home » Liferay Portal » Deutsch

Kombinierte Ansicht Flache Ansicht Baumansicht
Threads [ Zurück | Nächste ]
toggle
Jan Krueger
Remote-Zugriff einer ServiceUtil-Klasse
2. April 2013 23:50
Antwort

Jan Krueger

Rang: New Member

Nachrichten: 9

Eintrittsdatum: 12. Oktober 2012

Neue Beiträge

Hi Gurus,
die JavaDocs der ServiceUtil-Klassen sagen:
This is a remote service. Methods of this service are expected to have security checks based on the propagated JAAS credentials because this service can be accessed remotely.
Wie kann ich z.B. JournalArticleServiceUtil remote aufrufen?

Hier https://www.liferay.com/de/documentation/liferay-portal/6.1/development/-/ai/invoking-the-api-remotely ist das grundsätzlich beschrieben.
Note too, if you want to use the API through Remote Procedure Calls (RPC), you can do so.
Aber wie ist das konkret zu implementieren?

An welcher Stelle definiere ich das Remote-System? Nach meinem Verständnis muss ich einen PermisseionChecker instanziieren. Hierzu steht PermissionCheckerFactoryUtil zur Verfügung. Wie definiere ich allerdings das Remote-System?

Einige Methoden von JournalArticleServiceUtil besitzen das Attribut ServiceContext. In diesem kann man PortalUrl, RemoteHost oder RemoteAddr setzen. Allerdings hat das keine Auswirkungen.

Liferay stellt eine Client-Library unter http://www.liferay.com/downloads/liferay-portal/additional-files zur Verfügung. Allerdings beinhaltet diese Library nur Soap-Clients. Gibt es einen RPC/RMI-Client?

Kann mir jemand ein Coding-Beispiel zur Verfügung stellen?

Vielen Dank
Jan Krüger
Stefan Brötz
RE: Remote-Zugriff einer ServiceUtil-Klasse
17. Oktober 2013 05:43
Antwort

Stefan Brötz

Rang: Junior Member

Nachrichten: 78

Eintrittsdatum: 1. Februar 2010

Neue Beiträge

Hmm, was hast Du genau vor?

Willst Du (nur) von Javascript-Code aus auf eine Methode des JournalArticleService zugreifen? Dann rufe in Deinem Portal mal die URL http://localhost:8080/api/jsonws auf. Links findest Du alle Methoden (gruppiert nach Services), die remote aufgerufen werden können. Klicke auf einen Methodennamen und Du siehst die Signatur der Methode. Gleichzeitig kannst Du von dieser Stelle aus die Methode aufrufen.

Dort angekommen kannst Du Dir im HTML-Quelltext angucken, wie der Methodenaufruf realisiert ist. Ansonsten ist die Beschreibung in https://www.liferay.com/de/documentation/liferay-portal/6.1/development/-/ai/json-web-services lesenswert, wobei Du hier ein bisschen selektiv lesen musst: Der Client-seitige Teil ist sehr stark verwoben mit dem Server-seitigen Anteil.

Gruß, Stefan.
Jan Krueger
RE: Remote-Zugriff einer ServiceUtil-Klasse
21. Oktober 2013 01:15
Antwort

Jan Krueger

Rang: New Member

Nachrichten: 9

Eintrittsdatum: 12. Oktober 2012

Neue Beiträge

Hallo Stefan,
vielen Dank für Deine Antwort!
Ich möchte nicht via Web-Service sonder via RPC einen Server aufrufen. Das RPC API bietet andere und "mächtigere" Methoden an. Allerdings ist mir bis heute nicht ganz klar, wie dieser RPC-Call funktionieren kann.
Das Ganze ist ja bereits ein paar Wochen her und ich habe mir mittlerweile mit eigenen Web-Services beholfen.
Gruß
jan
Stefan Brötz
RE: Remote-Zugriff einer ServiceUtil-Klasse
23. Oktober 2013 09:07
Antwort

Stefan Brötz

Rang: Junior Member

Nachrichten: 78

Eintrittsdatum: 1. Februar 2010

Neue Beiträge

Hallo Jan,
Jan Krueger:
Ich möchte nicht via Web-Service sonder via RPC einen Server aufrufen. Das RPC API bietet andere und "mächtigere" Methoden an. Allerdings ist mir bis heute nicht ganz klar, wie dieser RPC-Call funktionieren kann.

Aha. Und welches Protokoll soll bei Deinem RPC verwendet werden? Außer diversen HTTP-Varianten (XML over HTTP, JSON over HTTP, SOAP over HTTP) und eventuell irgendwelchen MessageBus-Techniken ist mir gerade nichts geläufig, womit man sonst RPC umsetzen könnte.

Welche Variante man auch immer einsetzt, immer ist der zugehörige Endpunkt der zugehörige Remote-Service. Dass man auf anderem Wege an mächtigere Methoden kommen soll, kann und will ich mir gerade nicht so ganz vorstellen: Sollte das heißen, ich könnte von irgendwoher meine LocalServices aufrufen, die eigentlich nur von "trusted code" aus erreichbar sein soll(t)en?

:kopfkratz:

Gruß, Stefan.
Jan Krueger
RE: Remote-Zugriff einer ServiceUtil-Klasse
29. Oktober 2013 12:09
Antwort

Jan Krueger

Rang: New Member

Nachrichten: 9

Eintrittsdatum: 12. Oktober 2012

Neue Beiträge

Hallo Stefan,
vielen Dank für Dein Feedback!
Unter http://cdn.docs.liferay.com/portal/6.1/javadocs/com/liferay/portlet/journal/service/JournalArticleServiceUtil.html findest Du die folgenden Dokumentation:
This is a remote service. Methods of this service are expected to have security checks based on the propagated JAAS credentials because this service can be accessed remotely.
Ich habe mich einfach gefragt, wie ich z.B. die Methode addArticle(...) verwende. An welcher Stelle übergebe ich die JAAS credentials? Wie funktioniert das im Detail? Und wenn das ein remote service ist, wie definiere ich das Zielsystem?
Gruß
jan
Stefan Brötz
RE: Remote-Zugriff einer ServiceUtil-Klasse
30. Oktober 2013 02:12
Antwort

Stefan Brötz

Rang: Junior Member

Nachrichten: 78

Eintrittsdatum: 1. Februar 2010

Neue Beiträge

Hallo Jan.

Jan Krueger:
Ich habe mich einfach gefragt, wie ich z.B. die Methode addArticle(...) verwende.


Liferay bindet eine JavaScript-Datei namens service.js(?) ein, eventuell passiert das auch über den Minifier, so dass Du sie nicht direkt siehst. Notfalls musst Du sie selbst z.B. in Dein Theme einbauen.

Wenn Du das gemacht hast, dann steht Dir die JSON-Service-API im JavaScript-Namespace zur Verfügung. Details siehe dort: https://www.liferay.com/community/wiki/-/wiki/Main/JSON+Service+API#section-JSON+Service+API-Invoking+the+JSON+API

Du kennst die URL http://localhost:8080/api/jsonws/? Ruf sie mal auf und finde viele Beispiele, Dokumentation aller verfügbaren Services und direkte Aufrufmöglichkeiten.

Jan Krueger:
An welcher Stelle übergebe ich die JAAS credentials? Wie funktioniert das im Detail?


Eigentlich musst Du gar nichts übergeben, das macht das Framework für Dich. Sprich: Wenn Du als Nutzer angemeldet bist, dann werden diese Nutzer-Credentials automatisch übergeben. Wenn niemand angemeldet ist, gibt's entweder 'ne Exception oder Du wirst per HTTP-Basic-Authentication (Browser-Popup) zur Authentifizierung aufgefordert.

Technisch sind dafür das JSONServlet und das JSONWebServiceServlet verantwortlich.

Jan Krueger:
Und wenn das ein remote service ist, wie definiere ich das Zielsystem?


Das Zielsystem ist das Liferay, auf dem der Remote-Service läuft. Die JSON-Service-API wird ja über eine URL aufgerufen, z.B. http://<server-name>:<port>/api/jsonws/... Server-Name und Port legen das Liferay fest, auf dem die Services aufgerufen werden (lies: in dem Du z.B. JournalArticles angelen möchtest).

Gruß, Stefan.
Jan Geißler
RE: Remote-Zugriff einer ServiceUtil-Klasse
30. Oktober 2013 10:40
Antwort

Jan Geißler

Community Moderator

Rang: Liferay Master

Nachrichten: 711

Eintrittsdatum: 5. Juli 2011

Neue Beiträge

Doofe Frage Namensvetter, aber was genau willst du eigentlich machen?

Das hab ich noch nicht gelesen, und da ich nicht genau weiss was du machen willst fällt es schwer eine Antwort zu geben ;)

Willst du eine Native Mobile App bauen, wo du über RemoteService Calls deine Daten einsammelst?
Willst du Via Ajax deine Webseite dynamischer gestalten?
Willst du daten aus Liferay in ein anderes System übernehmen?

So viele Sachen die man machen kann....

So long!

Jan
Jan Krueger
RE: Remote-Zugriff einer ServiceUtil-Klasse
5. November 2013 08:33
Antwort

Jan Krueger

Rang: New Member

Nachrichten: 9

Eintrittsdatum: 12. Oktober 2012

Neue Beiträge

Hallo und vielen Dank für Deinen Input.
Das ist ja schon eine Weile her... und ich habe das bereits anders gelöst.
Ich wollte z.B. aus einem Java Job heraus das besagte API - den "remote service" - aufrufen.
Der Job sollte z.B. in einer eigenen JVM laufen oder in einer anderen Liferay-Instanz.
Gruß
jan
Christian P. Lerch
RE: Remote-Zugriff einer ServiceUtil-Klasse
4. Dezember 2013 01:38
Antwort

Christian P. Lerch

Rang: New Member

Nachrichten: 17

Eintrittsdatum: 22. Juni 2012

Neue Beiträge

Hallo Jan,
vor einiger Zeit habe ich mich das auch alles in Zuge eines Projekts gefragt, in dem es darum ging, von einem externen Java-Prozess aus Dateien aus Liferay herauszuholen und wieder zurückzuspeichern.
Nach einigen frustrierenden Recherchen - weil dokumentiert darüber ist wirklich absolut nichts (oder ich hab das alles übersehen emoticon), und aufwendiger, tiefer gehender Code-Analyse musste ich leider feststellen, dass keine der Liferay Remote APIs - also weder SOAP, noch JSON, noch RPC-over-HTTP (ja, die gibt's tatsächlich auch noch) das Arbeiten mit dem Content von FileEntries über eine Remote-Verbindung unterstützt. Eigentlich krass.
Da ich die Funktionalität aber dringend brauchte, hab ich eine standalone Java SE 7 Library implementiert, die das nunmehr leistet und ganz ohne Portal Infrastruktur auskommt. Leider kommt man dabei z.Z. für den File-Download noch nicht um eine kleine Ergänzung im portal-service Code herum, aber immerhin kann ich jetzt von einer anderen Maschine aus mit einer kohärenten API Liferay Dateien bearbeiten.
Falls das für Dich (oder andere) in Zukunft interessant sein sollte:
SourceCode + Binaries + Kurzbeschreibung findest Du hier zum download.
Für etwaige Fragen dazu stehe ich natürlich gerne zur Verfügung. Kommentare, Anregungen oder Kritik dazu sind auch sehr Willkommen.

Gruß,
Christian
Christian P. Lerch
RE: Remote-Zugriff einer ServiceUtil-Klasse
10. Dezember 2013 05:06
Antwort

Christian P. Lerch

Rang: New Member

Nachrichten: 17

Eintrittsdatum: 22. Juni 2012

Neue Beiträge

Die Frage von Jan

Ich möchte nicht via Web-Service sonder via RPC einen Server aufrufen. Das RPC API bietet andere und "mächtigere" Methoden an. Allerdings ist mir bis heute nicht ganz klar, wie dieser RPC-Call funktionieren kann.


ist sehr berechtigt. Steht doch in Invoking the API Remotely tatsächlich ein winzig-kleiner Hinweis: "You can also use the API through Remote Procedure Calls (RPC)." Der einzige Hinweis auf RPC in der ganzen Liferay Dokumentation übrigens.

Tatsächlich gibt es nun im portal-impl.jar im package com.liferay.service.http die Klassen xyzServiceHttp, welche ganz im Gegensatz zu den SOAP und JSON Webservices, auf vollkommen andere Weise mit den Liferay Services kommunizieren, nämlich durch (binäre) Java-Serialisierung von Methoden-Aufrufen und Tunneling derselben via HTTP Connection an das TunnelServlet. Dieses deserialisiert am Portal dann den remote Method-Call und führt ihn gegen die Liferay Service API aus. Etwaige Rückgabewerte werden wieder serialisiert und an den Caller über die HTTP-Connection zurück gesendet. Das Ganze sieht von außen betrachtet wie Java RMI aus, verwendet dafür aber nicht das standardisiert Java Remote Method Protocol JRMP, sondern offenbar eine proprietäre, aber sehr effiziente Variante davon.

Vorteile gegenüber SOAP und JSON Webservices sind 1. bessere Performance, weil die Serialisierung in Textformat vermieden wird, und 2. umfassendere APIs, weil über SOAP und JSON ist ja nur ein Subset der verfügbaren Liferay Portal und Portlet Services erreichbar.

Nachteile: Nur von Java Code aus nutzbar und, da im portal-impl.jar "mitgeliefert", nur zur Inter-Portal Kommunikation, nicht aber für Standalone-Betrieb (ohne Application Server) vorgesehen.

Den letzteren Nachteil habe ich nun versucht mit einer Standalone-Implementierung (siehe hier) zu eliminieren und bereits in einem Projekt erfolgreich einsetzen können.

Gruß,
Christian
Jan Krueger
RE: Remote-Zugriff einer ServiceUtil-Klasse
10. Januar 2014 00:54
Antwort

Jan Krueger

Rang: New Member

Nachrichten: 9

Eintrittsdatum: 12. Oktober 2012

Neue Beiträge

Hallo Christian,

vielen Dank für Deinen Input! Endlich versteht mich hier einer... ;-)
Vielen Dank auch für Deinen Sourcen. Ich werde mir das bei Gelegenheit mal ansehen.

Gruß
jan

Entschulige bitte meine späte Reaktion die aufgrund von Projektstress und Urlaub erst jetzt erfolgt.
Christian P. Lerch
RE: Remote-Zugriff einer ServiceUtil-Klasse
10. Januar 2014 03:59
Antwort

Christian P. Lerch

Rang: New Member

Nachrichten: 17

Eintrittsdatum: 22. Juni 2012

Neue Beiträge

Hallo Jan,

freut mich!
Die Doku ist leider noch etwas dürftig, ich hab aber vor, das bei Gelegenheit nachzuholen emoticon
Solltest Du vorher Fragen zur Anwendung der Library haben, kannst Du mich hier direkt erreichen.

Beste Grüße,
Christian