使用Liferay的服务构建器访问数据库中的现有表

Pau*_*der 5 liferay

我正在编写一个portlet,需要从另一个服务构建器portlet创建的liferay数据库中的一组表中读取.

我试着复制service.xml并构建服务,我遇到的麻烦就是:

BeanLocator尚未设置

是否有一种简单的方法来编写可以访问这些现有表的第二个portlet,并且服务构建器是否可以配置为执行此操作而不是尝试重新创建已存在的内容?

如果可能的话,我不想将它添加到原始portlet中,因为这些表保存了各种其他portlet可能需要访问的信息,并且在一个部署中拥有大量portlet会使维护变得令人头疼.

bra*_*zzi 7

要在不同的portlet中访问服务的相同表,请不要在每个portlet中重新创建服务.而是在一个portlet中创建服务并将其复制docroot/WEB-INF/lib/<pluginmame>-portlet-service.jardocroot/WEB-INF/lib/其他portlet 的目录中.让我们看一个例子.

假设您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>
Run Code Online (Sandbox Code Playgroud)

您像往常一样生成服务并在原始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>
Run Code Online (Sandbox Code Playgroud)

现在,假设您需要另一个portlet,某种Hello World向所有注册人员发送问候消息.您创建了一个新的portlet插件 - 我们说,调用multiple-hello-portlet- 然后将文件person-portlet-service.jarperson-portlet/docroot/WEB-INF/lib目录复制到multiple-hello-portlet/docroot/WEB-INF/lib.如果您同时部署在同一portal_的portlet,您可以使用创建的服务person-portletmultiple-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>
<% } %>
Run Code Online (Sandbox Code Playgroud)

我使用这些示例创建了两个可运行的portlet,您可以在BitBucket中找到它们.


fim*_*mez 1

您可以将服务构建器的内容放入其自己的 Liferay Hook 插件中,其他 portlet 依赖该插件(也称为需要部署插件才能使 portlet 工作)。

您还可以使用 EXT 插件而不是钩子,它可以使用您的自定义服务构建器扩展 Liferay。

  • 关于 EXT 插件,您有一个观点,因为它们很难部署/取消部署/重新部署,并且最好避免,除非没有其他 Liferay 插件类型适合您的需要。 (2认同)