2012-03-05 17 views
5

我正在編寫一個portlet,它需要從liferay數據庫中由不同服務構建器portlet創建的一組表中讀取。使用Liferay的服務構建器訪問數據庫中的現有表格

我嘗試了複製service.xml中,建設服務和所有爲我的煩惱是:

BeanLocator尚未設置

是否有寫第二個Portlet的簡單方法可以訪問這些現有表,並且可以將服務構建器配置爲執行此操作,而不是嘗試重新創建已存在的表?

我不希望將其添加到原始portlet中,如果可能的話,因爲這些表包含各種其他portlet可能需要訪問的信息,並且在一個部署中擁有大量portlet會使維護頭痛。

回答

1

您可以將服務構建器的東西放入其自身的Liferay Hook插件中,以確保其他portlet依賴於(也稱爲插件需要部署以使portlet正常工作)。

您也可以使用EXT插件,而不是使用您的自定義服務構建器東西來擴展Liferay的鉤子。

+1

它不建議使用EXT的插件,如果你都不可能避免。在這種情況下,如Brandizzi所解釋的,通過在第二個portlet的類路徑中從第一個portlet生成{portletname} -portlet-service.jar可以輕鬆避免。 – Jonny 2012-03-06 07:57:03

+2

關於EXT插件,您有一點意見,因爲它們很難部署/取消部署/重新部署,並且最好避免,除非沒有其他適合您需要的Liferay插件類型。 – fimez 2012-03-06 15:16:06

7

要訪問不同portlet中服務的相同表,請不要在每個portlet中重新創建服務。相反,在一個portlet中創建服務並將其docroot/WEB-INF/lib/<pluginmame>-portlet-service.jar複製到其他portlet的docroot/WEB-INF/lib/目錄中。讓我們看一個例子。

假設你有以下的稱爲person-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> 

您生成的服務,並用它在原有的門戶,像往常一樣。例如,您可以創建一個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/docroot/WEB-INF/lib目錄複製到multiple-hello-portlet/docroot/WEB-INF/lib如果您同時在同一個portal_中部署了 portlet,則您也可以在multiple-hello-portlet中使用爲person-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找到。

+0

我實際上已經試過這個沒有成功,區別在於我從Java類而不是JSP訪問方法。 – 2012-03-06 11:43:45

+0

@PaulGilfedder如果使用JSP或Java,那麼效果與此方法相同,因此您可能在其他位置遇到問題。你在使用IDE嗎?如果是這樣,它會給出任何錯誤? – Jonny 2012-03-06 16:49:20

+0

@PaulGilfedder這很奇怪。什麼是您使用的Liferay版本? Liferay EE ou CE?它上面有一些SP嗎? – brandizzi 2012-03-08 13:41:05

1

通過運行服務構建器,它會生成一個jar文件以供其他portlet訪問。

默認情況下,生成的服務api jar將被捆綁在portlet war文件中。但是,如果你想要其他應用程序訪問你的服務,那麼服務API文件需要在服務器類路徑中。您可以通過點擊「首選項」按鈕來更改可訪問的首選項。(圖:6)

來自:http://www.liferay.com/de/about-us/news/-/blogs/2506216/maximized

相關問題