2012-03-05 11 views
5

Sto scrivendo un portlet che deve leggere da un set di tabelle nel database liferay creato da un portlet del service builder diverso.Utilizzo del builder di servizi di Liferay per accedere alle tabelle esistenti nel database

ho provato solo duplicare il service.xml e costruire il servizio e tutto quello che ottiene per i miei guai è:

BeanLocator non è stato impostato

Esiste un modo semplice di scrivere un secondo portlet che può arrivare a queste tabelle esistenti e può essere configurato per fare questo servizio piuttosto che provare a ricreare ciò che è già lì?

Non voglio aggiungere questo nel portlet originale se possibile poiché queste tabelle contengono informazioni che potrebbero richiedere l'accesso a una serie di altri portlet e un numero elevato di portlet in una distribuzione renderà la manutenzione un problema .

risposta

1

È possibile inserire il generatore di servizi in un Liferay Hook Plugin autonomo, di cui gli altri portlet dipendono (ovvero il plug-in deve essere distribuito affinché i portlet funzionino).

È anche possibile utilizzare un plug-in EXT invece di un hook che estendere Liferay con il proprio generatore di servizi personalizzati.

+1

Non è consigliato l'utilizzo di plug-EXT se si può eventualmente evitarlo. In questo caso è facilmente evitabile avendo il {portletname} -portlet-service.jar prodotto dal primo portlet sul classpath del secondo portlet come spiega Brandizzi. – Jonny

+2

Hai un punto riguardante i plugin EXT, in quanto sono molto difficili da implementare/annullare la distribuzione/ridistribuzione, e sono i migliori da evitare a meno che non ci sia un altro tipo di plugin Liferay che si adatta alle tue necessità. – fimez

7

Per accedere alle stesse tabelle di un servizio in portlet diversi, non ricreare i servizi in ciascuno di essi. Creare invece il servizio in un portlet e copiare il suo docroot/WEB-INF/lib/<pluginmame>-portlet-service.jar nella directory docroot/WEB-INF/lib/ degli altri portlet. Vediamo un esempio.

si supponga di avere il seguente service.xml in un portlet chiamato 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> 

si genera il servizio e utilizzarlo nel portlet originale, come al solito. Ad esempio, è possibile creare una JSP con un modulo per la registrazione persona e persona messa in vendita:

<%@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> 

Ora, supponiamo che è necessario un altro portlet, una sorta di Ciao Mondo che presenta un messaggio di saluto a tutte le persone registrate. Si crea un nuovo plug-in per portlet, chiamato, per esempio, multiple-hello-portlet, quindi copia il file person-portlet-service.jar dalla directory person-portlet/docroot/WEB-INF/lib a multiple-hello-portlet/docroot/WEB-INF/lib. Se si dispone di entrambi i portlet distribuiti nello stesso portale_, è possibile utilizzare anche i servizi creati per person-portlet nello multiple-hello-portlet. Ad esempio, il multiple-hello-portlet può avere i seguenti JSP e non v'è alcuna necessità di reimplementare servizi:

<%@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> 
<% } %> 

ho creato due portlet eseguibili con questi esempi, che si può trovare in BitBucket.

+0

In realtà l'ho provato senza successo, la differenza è che sto accedendo ai metodi da una classe java piuttosto che da JSP. –

+0

@PaulGilfedder L'effetto sarebbe lo stesso con questo approccio se fosse su JSP o Java, quindi potresti avere un problema da qualche altra parte. Stai usando un IDE? In caso affermativo, fornisce errori? – Jonny

+0

@PaulGilfedder che è strano. Qual è la versione di Liferay che stai utilizzando? Liferay EE o CE? C'è qualche SP su di esso? – brandizzi

1

Eseguendo il service-builder, genera un file jar per l'accesso da altri portlet.

Per impostazione predefinita, il file jar di servizio generato verrà inserito nel file di guerra del portlet. Ma se vuoi che altre applicazioni accedano ai tuoi servizi, allora il file jar del servizio API deve essere presente nel classpath del server. Puoi farlo modificando le preferenze a cui puoi accedere facendo clic sul pulsante "Preferenze".(Fig: 6)

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