Liferay 6 utilisant Common Service Builder layer Error-BeanLocatorException-BeanLocator n'a pas été défini

nous essayons d'utiliser liferay Service builder comme couche commune pour tous nos portlets. Nous avons créé un projet de portlet commun séparé où nous construisons le service en utilisant le service.xml génère un service.fichier jar pour nous. Nous copions ce bocal à tous les portlets WEB-INF / lib dir.

quand nous exécutons le portlet il lance l'erreur suivante sur les journaux et le portlet est temporairement indisponible le message est affiché sur le portlet.

14:43:17,447 ERROR [jsp:154] com.liferay.portal.kernel.bean.BeanLocatorException: BeanLocator has not been set
    at com.liferay.portal.kernel.bean.PortletBeanLocatorUtil.locate(PortletBeanLocatorUtil.java:40)
    at com.cogs.common.service.CourseLocalServiceUtil.getService(CourseLocalServiceUtil.java:223)
    at com.cogs.common.service.CourseLocalServiceUtil.getCoursesCount(CourseLocalServiceUtil.java:187)
    at org.apache.jsp.jsps.course.course_005fview_jsp._jspService(course_005fview_jsp.java:542)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)

je suis sûr que cette approche devrait fonctionner sans heurts. Mais trouvé plusieurs personnes se plaignant à ce sujet sur les forums de liferay, mais n'a pas encore trouvé de solution. S'il vous plaît nous faire savoir si vous avez trouvé un moyen d'utiliser service builder comme une couche commune et cela a fonctionné pour vous.

nous utilisons maven pour construire tous les projets portlet.

la Version Liferay est 6.0.5 Et nous utilisons Spring Portlet MVC pour notre développement de portlet.

10
demandé sur Kzvi 2011-06-10 21:21:49

11 réponses

vous devez construire-service et déployer le (Portlet-Hook) qui est requis pour votre portlet actuel, vous pouvez le connaître par voir son nom dans liferay-plugin-package.propriétés du fichier:

required-deployment-contexts=[Portlet-Hook name]
3
répondu Musharraf Al-tamimi 2013-12-11 13:47:18

j'ai essayé ce qui est écrit sur la page, mais rien n'a fonctionné pour moi, jusqu'à ce que j'ai ajouté la version du projet

maven-pluginname en pom:

            <configuration>
                <autoDeployDir>${liferay.auto.deploy.dir}</autoDeployDir>
                <appServerDeployDir>${liferay.app.server.deploy.dir}</appServerDeployDir>
                <appServerLibGlobalDir>${liferay.app.server.lib.global.dir}</appServerLibGlobalDir>
                <appServerPortalDir>${liferay.app.server.portal.dir}</appServerPortalDir>
                <liferayVersion>${liferay.version}</liferayVersion>
                <pluginType>portlet</pluginType>
                <pluginName>${project.artifactId}-${project.version}</pluginName>
            </configuration>

et liferay-plugin-paquet.propriétés:

   artifactId-version-deployment-context=artifactId-version

par exemple:

   portlet-sample-1.0-deployment-context=portlet-sample-1.0

artifactId = portlet-exemple

et version = 1,0

après tout j'ai construit des services, et j'ai redéployé mes guerre.

je suis arrivé à la solution parce que j'ai débogué:

com.liferay.portail.noyau.haricot.PortletBeanLocatorUtil

BeanLocator beanLocator = getBeanLocator(servletContextName);

est appelé qui renvoie toujours null sans numéro de version...

j'espère que quelqu'un les aide.

3
répondu Lumpi47 2016-01-19 11:53:06

j'ai eu du mal à trouver une solution à cette erreur donc je vais poster ce que nous avons fait. Le nom de la portlet changé, construit le service et lors de l'exécution de la portlet jette la même erreur:

com.liferay.portal.kernel.bean.BeanLocatorException: BeanLocator has not been set for servlet context

Dans notre cas, nous avons dû supprimer le fichier jar de ../ docroot/WEB-INF/lib / portlet-service.jar

2
répondu Ursula 2012-01-16 11:36:14

nous avions une exigence d'utiliser quelque chose de similaire: avoir un portlet (disons Source-portlet) dont les services seront utilisés par d'autres portlets.

donc nous déplacé l'généré sourceportlet-service.jar à partir de la Source de portlet WEB-INF/lib{tomcat_home}/lib/ext dossiers étaient d'autres jarres comme portlet-service.jar etc résident.

le côté négatif de cette approche est que chaque fois qu'il y a un changement dans le port-source, nous devrions redémarrer le serveur.

si l'autre portlet sont votre plugin personnalisé portlets qu'une autre approche serait de copier le générés sourceportlet-service.jar vers un autre portlet WEB-INF/lib. Cette approche ne fonctionne pas si vous utilisez le service dans un crochet JSP.

J'espère que cela vous aidera.

2
répondu Prakash K 2014-04-29 11:59:40

la réponse précédente de Martin Gamulin est correcte. Si vous avez deux applications web séparées, l'une pour les portlets Spring et l'autre avec votre Service Builder (qui semble être la bonne façon de faire les choses à Liferay), alors vous devez vous assurer que vos portlets Spring ne font pas référence à vos classes ServiceBuilder lors de l'initialisation.

s'ils le font alors en fonction de l'ordre dans lequel votre serveur app instancie votre webapps (et dans Tomcat vous ne pouvez pas spécifier un ordre de démarrage), le BeanLocatorException se produira à chaque fois que le portlets webapp se déploie avant le constructeur webapp.

dans notre cas cela signifiait déplacer un XxxLocalServiceUtil.createXxx(0) appel du constructeur du portlet Controller vers les méthodes correspondantes.

1
répondu kenstershiro 2011-11-24 16:47:30

j'ai eu un problème similaire en faisant un maven portlet. D'abord j'ai fait le portlet et ensuite j'ai mis le service.xml

le problème était que le générateur cherchait un nom de portlet qui n'était pas là j'ai résolu de faire expliciter le nom de portlet j'ai voulu le génrator pour chercher

en particulier, pour ce faire, deux pom nœuds doit être égale à

projet.artifatctId = (liferay crée un localisateur de haricots pour cela)

et

projet.construire.(Liferay plugin).configuration.pluginName = le Nom interne du portlet pour le générateur

comme un exemple, un petit extrait de mon pom.xml

<modelVersion>4.0.0</modelVersion>
<groupId>io.endeios</groupId>
<artifactId>ShowTheCats-portlet</artifactId><!-- ONE -->
<packaging>war</packaging>
<name>ShowTheCats Portlet</name>
<version>1.0-SNAPSHOT</version>
<build>
    <plugins>
        <plugin>
            <groupId>com.liferay.maven.plugins</groupId>
            <artifactId>liferay-maven-plugin</artifactId>
            <version>${liferay.maven.plugin.version}</version>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>build-css</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <autoDeployDir>${liferay.auto.deploy.dir}</autoDeployDir>
                <appServerDeployDir>${liferay.app.server.deploy.dir}</appServerDeployDir>
                <appServerLibGlobalDir>${liferay.app.server.lib.global.dir}</appServerLibGlobalDir>
                <appServerPortalDir>${liferay.app.server.portal.dir}</appServerPortalDir>
                <liferayVersion>${liferay.version}</liferayVersion>
                <pluginType>portlet</pluginType>
                <pluginName>ShowTheCats-portlet</pluginName><!-- TWO -->
            </configuration>
        </plugin>

un et deux doivent être les mêmes

1
répondu Endeios 2014-10-24 17:27:44

problème avec BeenLocator avec mon ressort portlet pour moi était que le contexte de ressort de mon portlet était initialisé avant le contexte de ressort de liferay.

j'ai été en utilisant ClassName className = ClassNameLocalServiceUtil.getClassName(JournalArticle.class.getName()); dans mon constructeur. Le contexte de LIferay n'était pas chargé, d'où l'erreur. J'ai déplacé ce morceau de code pour qu'il soit appelé quand (seulement ce temps) la première requête en avait besoin. Le problème a été résolu.

Donc, ne dépend pas de lifery lors de l'initialisation de votre portlet, faire une sorte de "paresseux" câblage de les dépendances de liferay.

0
répondu Martin Gamulin 2011-11-18 08:54:03

puisque vous utilisez maven, essayez de vous assurer que votre nom de guerre est égal au nom de votre projet portlet. Après debug, j'ai trouvé que ClpSerializer définit _servletContextName est égal à <artifactId> du projet de guerre. Si vous déployez un artefact nommé artifactId-1.0.0-snapshot.war le contexte est créé avec ce nom, mais le code généré par le servicegen attend artifactId. Vérifiez avec votre ClpSerializer.

0
répondu sab 2013-05-30 10:23:13

j'ai aussi eu le même problème. J'ai placé le code suivant dans liferay-plugin-paquet.fichier de propriétés de portlets qui utilise la couche de service de portlet commun. Il a travaillé pour moi.

required-deployment-contexts=common-portlet

il vaut mieux copier le service.le fichier jar à tomcat/lib/ext à la place de tous les portlets WEB-INF/lib.

0
répondu Chaitanya Kumar Ch 2013-10-10 05:53:17

N'a pas l'air de travailler pour l'exemple de Calendrier de portlet qui fait partie de la liferay Plugins 6.2 source.

erreur postée sur

https://www.liferay.com/community/forums/-/message_boards/message/38041984

0
répondu user3660634 2014-05-21 11:44:18

j'ai fait ce qui suit pour résoudre le problème ci-dessus:

  1. définir la propriété de configuration pluginName dans pom.xml pour le bon contexte

        <plugin>
            <groupId>com.liferay.maven.plugins</groupId>
            <artifactId>liferay-maven-plugin</artifactId>
            <version>${liferay.version}</version>
            <configuration>
                <autoDeployDir>${liferay.auto.deploy.dir}</autoDeployDir>
                <appServerPortalDir>${liferay.app.server.portal.dir}</appServerPortalDir>
                <liferayVersion>${liferay.version}</liferayVersion>
                <pluginType>portlet</pluginType>
                <pluginName>XXXX-portlet</pluginName>
            </configuration>
        </plugin>
    
  2. option définir le XXXX-portlet-déploiement-contexte de la propriété dans liferay plugin fichier de propriétés ou de portlet.fichier de propriétés

XXXX-portlet-deployment-context=XXXX-portlet

  1. Re-Construire les services
  2. vérifier si le ClpSerializer généré.java contient le bon contextes

' public static String getServletContextName() { si (Validateur.isNotNull(_servletContextName)) { return _servletContextName; }

    synchronized (ClpSerializer.class) {
        if (Validator.isNotNull(_servletContextName)) {
            return _servletContextName;
        }

        try {
            ClassLoader classLoader = ClpSerializer.class.getClassLoader();

            Class<?> portletPropsClass = classLoader.loadClass(
                    "com.liferay.util.portlet.PortletProps");

            Method getMethod = portletPropsClass.getMethod("get",
                    new Class<?>[] { String.class });

            String portletPropsServletContextName = (String) getMethod.invoke(null,
                    "XXXX-portlet-deployment-context");

            if (Validator.isNotNull(portletPropsServletContextName)) {
                _servletContextName = portletPropsServletContextName;
            }
        } catch (Throwable t) {
            if (_log.isInfoEnabled()) {
                _log.info(
                    "Unable to locate deployment context from portlet properties");
            }
        }

        if (Validator.isNull(_servletContextName)) {
            try {
                String propsUtilServletContextName = PropsUtil.get(
                        "XXXX-portlet-deployment-context");

                if (Validator.isNotNull(propsUtilServletContextName)) {
                    _servletContextName = propsUtilServletContextName;
                }
            } catch (Throwable t) {
                if (_log.isInfoEnabled()) {
                    _log.info(
                        "Unable to locate deployment context from portal properties");
                }
            }
        }

        if (Validator.isNull(_servletContextName)) {
            _servletContextName = "upay-portlet";
        }

        return _servletContextName;
    }
}`
  1. déployer la guerre, vérifier le nom de guerre et les journaux pour le nom de contexte correct.
0
répondu Ashok Felix 2015-10-26 15:33:07