[JAVA] Comment appeler des services personnalisés / services standard à partir de Liferay 7 / DXP- Workflow / Workflow Script

Liferay7 / DXP - Comment appeler des services personnalisés / services standard à partir de Workflow / Workflow Script

L'une des fonctionnalités puissantes de Liferay est le flux de travail. Le flux de travail peut être défini graphiquement à l'aide de Kaleo Designer sur l'écran de gestion, mais dans les cas réels, non seulement les fonctions standard mais aussi les scripts (Groovy, Javascript) sont utilisés pour approuver dynamiquement l'approbateur. Fait souvent des sélections et des notifications.

Ce faisant, j'utilise souvent les services intégrés de Liferay ou les services personnalisés que j'ai développés, mais l'appel de service standard sur dev.liferay.com utilise toujours l'ancien 6.2 LocalServiceUtil, ce qui est faux. J'ai essayé de faire un échantillon ci-dessous.

L'architecture est passée de Liferay7 / DXP à OSGi, et la méthode d'appel de service a changé depuis la version 6.2. Cela prend la forme de se renseigner sur le framework OSGi et de récupérer les services nécessaires.

Lorsque vous appelez normalement un service à partir du code Java, utilisez l'annotation @Reference comme vous pouvez le voir en vous référant au codage du groupe de services dans le noyau Liferay sur https://github.com/liferay/liferay-portal. fais le

Comment obtenir des services en code Java (extrait du code Liferay-Portal)

WSRPAdminPortlet.java


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

    _wSRPConsumerPortletLocalService = wSRPConsumerPortletLocalService;
}

private static WSRPConsumerPortletLocalService
    _wSRPConsumerPortletLocalService;

Il peut être écrit comme suit, mais dans les balises telles que l'affectation par script dans Workflow, il est décrit comme suit.

Comment obtenir et utiliser des services dans la page Script / 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()
    }
}

Cela fonctionne même s'il est décrit dans la définition du workflow, mais si vous voulez l'essayer facilement, après avoir créé du contenu Web, sélectionnez Groovy dans Panneau de configuration-> Configuration-> Administration du serveur-> Script. Si vous demandez et collez le code ci-dessus dans le champ Script, le titre du contenu Web créé sera affiché.

Selon la méthode d'OSGi, spécifiez le bundle de départ avec FrameworkUtil.getBundle (dans ce cas, puisque le moteur Groovy Script est utilisé, spécifiez GroovyExecutor.class) Ensuite, obtenez le service cible avec ServiceTracker Je le fait.

Recommended Posts

Comment appeler des services personnalisés / services standard à partir de Liferay 7 / DXP- Workflow / Workflow Script
Comment appeler le code Swift 5.3 depuis Objective-C
[ruby] Comment recevoir la valeur de l'entrée standard?
Comment sortir le standard d'un tableau avec for Each
Comment appeler AmazonSQSAsync
A étudié comment appeler des services avec Watson SDK pour Java
Comment ouvrir un fichier de script à partir d'Ubuntu avec du code VS