我们正在尝试将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开发。
答案 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)
我做了以下工作来解决上述问题:
将pom.xml中的插件配置属性pluginName设置为正确的上下文
ReturnView
(可选)在liferay插件属性文件或portlet.properties文件中设置XXXX-portlet-deployment-context属性
<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>
`public static String getServletContextName(){ if(Validator.isNotNull(_servletContextName)){ return _servletContextName; }
XXXX-portlet-deployment-context=XXXX-portlet