我正在编写一个portlet,需要从另一个服务构建器portlet创建的liferay数据库中的一组表中读取。
我尝试复制service.xml并构建服务,我遇到的麻烦就是:
尚未设置BeanLocator
是否有一种简单的方法来编写可以访问这些现有表的第二个portlet,并且服务构建器是否可以配置为执行此操作而不是尝试重新创建已存在的内容?
如果可能的话,我不想将其添加到原始portlet中,因为这些表保存了各种其他portlet可能需要访问的信息,并且在一个部署中拥有大量portlet会使维护变得令人头疼。
答案 0 :(得分:7)
要访问不同portlet中服务的相同表,请不要在每个portlet中重新创建服务。而是在一个portlet中创建服务,并将其docroot/WEB-INF/lib/<pluginmame>-portlet-service.jar
复制到其他portlet的docroot/WEB-INF/lib/
目录。让我们看一个例子。
假设您在名为service.xml
的portlet中有以下person-portlet
:
<service-builder package-path="br.com.seatecnologia.stackoverflow.person">
<author>brandizzi</author>
<namespace>StackOverflowPerson</namespace>
<entity name="Person" local-service="true" remote-service="false">
<column name="personId" type="long" primary="true" />
<column name="name" type="String" />
<column name="age" type="int" />
</entity>
</service-builder>
您可以像往常一样生成服务并在原始portlet中使用它。例如,您可以使用用于个人注册和人员列表的表单创建JSP:
<%@page import="br.com.seatecnologia.stackoverflow.person.service.PersonLocalServiceUtil"%>
<%@page import="br.com.seatecnologia.stackoverflow.person.model.Person"%>
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>
<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %>
<portlet:actionURL name="addPerson" var="url" />
<aui:form action="<%= url %>" name="fm" method="POST">
<aui:fieldset>
<aui:input name="name" />
<aui:input name="age" />
<aui:button type="submit" />
</aui:fieldset>
</aui:form>
<ul>
<% for (Person person : PersonLocalServiceUtil.getPersons(-1, -1)) { %>
<li><%= person.getName() %> : <%= person.getAge() %></li>
<% } %>
</ul>
现在,假设您需要另一个portlet,某种Hello World向所有注册人员发送问候语。您创建了一个新的portlet插件 - 我们称之为multiple-hello-portlet
- 然后将文件person-portlet-service.jar
从person-portlet/docroot/WEB-INF/lib
目录复制到multiple-hello-portlet/docroot/WEB-INF/lib
。 如果您在同一门户网站中部署了两个 portlet,则可以使用person-portlet
中为multiple-hello-portlet
创建的服务。例如,您的multiple-hello-portlet
可以拥有以下JSP ,并且不需要重新实现服务:
<%@page import="br.com.seatecnologia.stackoverflow.person.service.PersonLocalServiceUtil"%>
<%@page import="br.com.seatecnologia.stackoverflow.person.model.Person"%>
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>
<% for (Person person : PersonLocalServiceUtil.getPersons(-1, -1)) { %>
<div class="portlet-msg-info">
Hello, <%= person.getName() %>!
You are <%= person.getAge() %> years old.
</div>
<% } %>
我使用这些示例创建了两个可运行的portlet,可以在BitBucket中找到。
答案 1 :(得分:1)
你可以将服务构建器的东西放在它自己的Liferay Hook插件中,其他portlet依赖它(也就是需要部署插件才能使portlet工作)。
你也可以使用一个EXT插件而不是一个钩子,它可以用你的自定义服务构建器来扩展Liferay。
答案 2 :(得分:1)
通过运行服务构建器,它会生成一个jar-File,以便从其他portlet访问。
默认情况下,生成的服务api jar将捆绑在portlet war文件中。但是,如果您希望其他应用程序访问您的服务,则服务api jar文件需要位于服务器类路径中。您可以通过单击“首选项”按钮更改可以访问的首选项来完成此操作。 (图6)
来自:http://www.liferay.com/de/about-us/news/-/blogs/2506216/maximized