使用Liferay';s service builder来访问数据库中的现有表

使用Liferay';s service builder来访问数据库中的现有表,liferay,Liferay,我正在编写一个portlet,它需要从由不同的ServiceBuilderportlet创建的liferay数据库中的一组表中读取数据 我试图复制service.xml并构建服务,但我遇到的麻烦是: 未设置BeanLocator 是否有一种简单的方法可以编写第二个portlet来访问这些现有表,并且可以将ServiceBuilder配置为这样做,而不是尝试重新创建已有的表 如果可能的话,我不想将其添加到原始portlet中,因为这些表包含了其他各种portlet可能需要访问的信息,并且在一个部署

我正在编写一个portlet,它需要从由不同的ServiceBuilderportlet创建的liferay数据库中的一组表中读取数据

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

未设置BeanLocator

是否有一种简单的方法可以编写第二个portlet来访问这些现有表,并且可以将ServiceBuilder配置为这样做,而不是尝试重新创建已有的表


如果可能的话,我不想将其添加到原始portlet中,因为这些表包含了其他各种portlet可能需要访问的信息,并且在一个部署中拥有大量portlet会让维护成为一件头疼的事。

您可以将service builder的东西放在自己的Liferay钩子插件中,其他portlet所依赖的(需要部署aka插件才能使portlet工作)


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

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

假设您在名为
person portlet
的portlet中有以下
service.xml

<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,您可以在中找到。

通过运行service builder,它生成一个jar文件,供其他Portlet访问

默认情况下,生成的服务api jar将捆绑在portlet war文件中。但是,如果您希望其他应用程序访问您的服务,那么服务api jar文件需要位于服务器类路径中。您可以通过单击“首选项”按钮来更改首选项来实现这一点。(图6)


from:

如果您可以避免使用EXT插件,则不建议使用EXT插件。在这种情况下,正如Brandizzi所解释的,通过将第一个portlet生成的{portletname}-portlet-service.jar放在第二个portlet的类路径上是可以很容易避免的,除非没有其他适合您需要的Liferay插件类型,否则最好避免使用和。我实际上尝试过这种方法,但没有成功,不同之处在于我是从java类而不是JSP中访问方法的。@PaulGilfedder如果这种方法是在JSP或java上,效果将与此方法相同,因此您可能在其他地方遇到问题。您正在使用IDE吗?如果是这样的话,它会有错误吗?@PaulGilfedder,这很奇怪。您正在使用的Liferay的版本是什么?丽芙蕾·欧斯?我们使用的是经过大量修改的5.2.3版本。我在全新的Liferay 5.2.3中再次尝试了这种方法,它工作得非常完美。我敢打赌问题可能出在您的定制中(您使用的是EXT环境,对吗?)。不幸的是,
BeanLocator尚未设置
是一条毫无用处的错误消息,因为它总是发生,原因可能在代码的任何一点上。对不起,从这一点上我再也帮不上忙了:(
<%@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>
<%@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>
<% } %>