Liferay 6使用Common Service Builder层错误 - BeanLocatorException - 尚未设置BeanLocator

时间:2011-06-10 17:21:50

标签: exception spring-mvc liferay maven-3 liferay-6

我们正在尝试将liferay服务构建器用作所有portlet的公共层。我们创建了一个单独的公共portlet项目,我们使用service.xml构建服务。这为我们生成了一个service.jar文件。我们正在将这个jar复制到所有portlet WEB-INF / lib目录。

当我们运行portlet时,它会在日志上抛出以下错误,并且Portlet暂时不可用消息显示在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)

我确信这种方法应该无缝地工作。但发现有几个人在liferay论坛上抱怨它,但还没有找到任何解决方案。如果您找到一种方法将服务构建器用作公共层并且它对您有用,请告诉我们。

我们正在使用maven来构建所有portlet项目。

Liferay版本是6.0.5 我们正在使用Spring Portlet MVC进行portlet开发。

11 个答案:

答案 0 :(得分:3)

您必须构建服务并部署当前portlet所需的(Portlet-Hook),您可以通过在liferay-plugin-package.properties文件中查看其名称来了解它:

required-deployment-contexts=[Portlet-Hook name]

答案 1 :(得分:3)

我尝试了在该页面上写的任何东西,但没有任何对我有用,直到我添加了项目的版本

中的 maven-pluginname

            <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>

并在 liferay-plugin-package.properties 中:

   artifactId-version-deployment-context=artifactId-version

例如:

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

其中 artifactId = portlet-sample

版本 = 1.0

毕竟我建立了服务,并重新部署了我的战争。

我来到解决方案是因为我调试了:

<强> com.liferay.portal.kernel.bean.PortletBeanLocatorUtil

,其中

BeanLocator beanLocator = getBeanLocator(servletContextName);
调用

,它总是在没有versionnumber的情况下返回null ...

我希望有人能帮到你。

答案 2 :(得分:2)

我很难找到这个错误的解决方案,所以我会发布我们所做的。 portlet的名称已更改,构建了服务,并且在运行portlet时抛出相同的错误:

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

在我们的例子中,我们必须从../ docroot / WEB-INF / lib / portlet-service.jar中删除jar文件

答案 3 :(得分:2)

我们要求使用类似的东西:有一个portlet(比如Source-portlet),其服务将被其他portlet使用。

所以我们 移动了 生成的sourceportlet-service.jar从Source-portlet的WEB-INF/lib{tomcat_home}/lib/ext文件夹中的其他jars如{{ 1}}等等驻留。

这种方法的缺点是每当我们需要重新启动服务器的Source-portlet发生变化时。

如果其他portlet是你的自定义插件portlet,那么另一种方法是将生成的portlet-service.jar复制到其他portlet的sourceportlet-service.jar。如果您在JSP挂钩中使用该服务,则此方法不起作用。

希望这会有所帮助。

答案 4 :(得分:1)

Martin Gamulin之前的回答是正确的。如果您有两个单独的Web应用程序,一个用于Spring portlet,另一个用于Service Builder(这似乎是在Liferay中执行操作的正确方法),那么您需要确保Spring portlet在初始化期间不引用您的ServiceBuilder类

如果他们这样做,取决于您的应用服务器实例化您的Web应用程序的顺序(并且在Tomcat中您无法指定启动顺序),每次portlet webapp在构建器Web应用程序之前部署时都会发生BeanLocatorException。

在我们的例子中,这意味着将XxxLocalServiceUtil.createXxx(0)调用从portlet Controller的构造函数移动到相关方法。

答案 5 :(得分:1)

我在做maven portlet时遇到了类似的问题。 首先我做了portlet然后我把service.xml

问题在于生成器正在寻找不存在的portlet名称 我解决了说明我想让发起者寻找的portlet名称

特别是,要做到这一点,两个pom节点必须相等

project.artifatctId =(liferay为此创建一个bean定位器)

project.build。(liferay插件).configuration.pluginName =生成器portlet的内部名称

作为一个例子,来自我的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>

ONE和TWo必须相同

答案 6 :(得分:0)

对我来说,带有我的弹簧portlet的BeenLocator问题是 我的portlet的spring上下文在liferay的spring上下文之前被初始化了。

我正在使用 {@ 1}}在我的构造函数中。 LIferay的上下文没有加载因此错误。当第一次请求需要它时(我只有那个时间),我移动了那段代码。问题解决了。

所以在你的portlet初始化期间不要依赖于生命,做一些依赖性的“懒惰”连接到liferay。

答案 7 :(得分:0)

由于您使用的是maven,请尝试确保您的war名称等于您的portlet项目名称。 调试后我发现ClpSerializer定义了_servletContextName,它等于战争项目的<artifactId>。如果部署名为artifactId-1.0.0-snapshot.war的工件,则将使用该名称创建上下文,但servicegen生成的代码期望它为artifactId。与您的ClpSerializer核实。

答案 8 :(得分:0)

我也有同样的问题。我将以下代码放在portlet的liferay-plugin-package.properties文件中,该文件使用公共portlet的服务层。它对我有用。

required-deployment-contexts=common-portlet

最好将service.jar文件复制到tomcat / lib / ext而不是所有portlet WEB-INF / lib。

答案 9 :(得分:0)

似乎不适用于示例Calendar portlet,它是liferay插件6.2源代码的一部分。

错误发布在

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

答案 10 :(得分:0)

我做了以下工作来解决上述问题:

  1. 将pom.xml中的插件配置属性pluginName设置为正确的上下文

    ReturnView
  2. (可选)在liferay插件属性文件或portlet.properties文件中设置XXXX-portlet-deployment-context属性

  3. <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>

    1. 重新构建服务
    2. 验证生成的ClpSerializer.java是否包含正确的上下文
    3. `public static String getServletContextName(){         if(Validator.isNotNull(_servletContextName)){             return _servletContextName;         }

      XXXX-portlet-deployment-context=XXXX-portlet
      1. 部署战争,验证战争名称和日志以获取正确的上下文名称。