[JAVA] So rufen Sie benutzerdefinierte Dienste / Standarddienste über Liferay 7 / DXP-Workflow / Workflow-Skript auf

Liferay7 / DXP - So rufen Sie benutzerdefinierte Dienste / Standarddienste über Workflow / Workflow-Skript auf

Eine der leistungsstarken Funktionen von Liferay ist der Workflow. Der Workflow kann mit Kaleo Designer auf dem Verwaltungsbildschirm grafisch festgelegt werden. In tatsächlichen Fällen werden jedoch nicht nur Standardfunktionen, sondern auch Skripte (Groovy, Javascript) verwendet, um den Genehmigenden dynamisch zu genehmigen. Trifft häufig Auswahlen und Benachrichtigungen.

Dabei verwende ich häufig die von mir entwickelten integrierten oder benutzerdefinierten Dienste von Liferay, aber der Standarddienstaufruf auf dev.liferay.com verwendet immer noch das alte 6.2 LocalServiceUtil, was falsch ist. Ich habe versucht, unten ein Beispiel zu machen.

Die Architektur wurde von Liferay7 / DXP auf OSGi umgestellt, und die Dienstaufrufmethode wurde seit 6.2 geändert. Dies geschieht in Form einer Abfrage des OSGi-Frameworks und des Abrufs der erforderlichen Dienste.

Wenn Sie einen Dienst normalerweise aus Java-Code heraus aufrufen, verwenden Sie die Annotation @Reference, wie Sie anhand der Codierung der Dienstgruppe im Liferay-Kern unter https://github.com/liferay/liferay-portal sehen können. Tu es

So erhalten Sie Dienste in Java-Code (extrahiert aus Liferay-Portal-Code)

WSRPAdminPortlet.java


@Reference(unbind = "-")
protected void setWSRPConsumerPortletLocalService(
    WSRPConsumerPortletLocalService wSRPConsumerPortletLocalService) {

    _wSRPConsumerPortletLocalService = wSRPConsumerPortletLocalService;
}

private static WSRPConsumerPortletLocalService
    _wSRPConsumerPortletLocalService;

Es kann wie folgt geschrieben werden, aber in Tags wie der Skriptzuweisung in Workflow wird es wie folgt beschrieben.

So erhalten und verwenden Sie Dienste auf der Skriptseite / im Workflow

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker
import com.liferay.portal.scripting.groovy.internal.GroovyExecutor


def st = null
try {
    Bundle bundle = FrameworkUtil.getBundle(GroovyExecutor.class);

    st = new ServiceTracker(bundle.getBundleContext(), "com.liferay.journal.service.JournalArticleLocalService", null);

    st.open();
    if (!st.isEmpty()) {
        def service = st.getService();
        def articles = service.getArticles();
        for (def article: articles) {
            System.out.println("article Name:${article.getUrlTitle()}");
        }
    }
} catch(Exception e) {
    System.out.println("Handle error here appropriately")
    e.printStackTrace()
} finally {
    if (st != null) {
        st.close()
    }
}

Dies funktioniert auch dann, wenn es in der Workflow-Definition beschrieben ist. Wenn Sie es jedoch nach dem Erstellen von Webinhalten einfach ausprobieren möchten, wählen Sie Groovy in der Systemsteuerung-> Konfiguration-> Serververwaltung-> Skript aus. Wenn Sie nach dem obigen Code fragen und ihn in das Feld Skript einfügen, wird der Titel des erstellten Webinhalts angezeigt.

Geben Sie gemäß der OSGi-Methode das Startpaket mit FrameworkUtil.getBundle an (in diesem Fall, da die Groovy Script-Engine verwendet wird, geben Sie GroovyExecutor.class an). Rufen Sie als Nächstes den Zieldienst mit ServiceTracker ab Ich mache es.

Recommended Posts

So rufen Sie benutzerdefinierte Dienste / Standarddienste über Liferay 7 / DXP-Workflow / Workflow-Skript auf
So rufen Sie Swift 5.3-Code von Objective-C auf
[Ruby] Wie erhalte ich den Wert von der Standardeingabe?
So geben Sie einen Standard aus einem Array mit for Each aus
So rufen Sie AmazonSQSAsync auf
Untersucht, wie Dienste mit Watson SDK für Java aufgerufen werden
So öffnen Sie eine Skriptdatei von Ubuntu mit VS-Code