2012-03-05 6 views
5

Estoy escribiendo un portlet que necesita leer de un conjunto de tablas en la base de datos liferay creada por un portlet de generador de servicios diferente.Utilizando el constructor de servicios de Liferay para acceder a las tablas existentes en la base de datos

I probado casi duplicando la service.xml y construir el servicio y todo lo que consigo para mi problema es:

BeanLocator no se ha establecido

¿Hay una manera sencilla de escribir un segundo portlet que puede llegar a estas tablas existentes y puede configurar el generador de servicios para hacer esto en lugar de tratar de volver a crear lo que ya está allí?

No quiero agregar esto en el portlet original si es posible ya que estas tablas contienen información a la que otros portlets pueden necesitar acceso y tener una gran cantidad de portlets en una implementación hará que el mantenimiento sea un dolor de cabeza .

Respuesta

1

Puede poner las cosas del constructor de servicios en un complemento de Liferay Hook, del que dependen otros portlets (es necesario implementar el complemento para que los portlets funcionen).

También podría usar un complemento EXT en lugar de un gancho que ampliaría Liferay con su material personalizado de creación de servicios.

+1

No es recomendable utilizar plugins EXT si puedes evitarlo. En este caso, es fácilmente evitable al tener el {portletname} -portlet-service producido del primer portlet en el classpath del segundo portlet, como explica Brandizzi. – Jonny

+2

Tiene algo que ver con los complementos EXT, ya que son muy difíciles de implementar/anular/desplegar, y es mejor evitarlos a menos que no haya otro tipo de complemento Liferay que se adapte a sus necesidades. – fimez

7

Para acceder a las mismas tablas de un servicio en portlets diferentes, no vuelva a crear los servicios en cada uno. En su lugar, cree el servicio en un portlet y copie su docroot/WEB-INF/lib/<pluginmame>-portlet-service.jar en el directorio docroot/WEB-INF/lib/ de los otros portlets. Veamos un ejemplo.

Suponga que tiene la siguiente service.xml en un portlet denominado 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> 

a generar los servicios y para usarla en el portlet original, como de costumbre. Por ejemplo, puede crear una JSP con un formulario para el registro de una persona y otra lista:

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

Ahora, supongamos que necesita otro portlet, algún tipo de Hello World, que presenta un mensaje de bienvenida a todas las personas registradas. Crea un nuevo complemento de portlet, llamado, digamos, multiple-hello-portlet, y luego copia el archivo person-portlet-service.jar del directorio person-portlet/docroot/WEB-INF/lib al multiple-hello-portlet/docroot/WEB-INF/lib. Si tiene ambos portlets desplegados en el mismo portal_, puede usar los servicios creados para person-portlet en el multiple-hello-portlet también. Por ejemplo, su multiple-hello-portlet puede tener los siguientes JSP y no hay necesidad de reimplementar los servicios:

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

creé dos portlets ejecutables con estos ejemplos, que se puede encontrar en BitBucket.

+0

En realidad, he intentado esto sin éxito, la diferencia es que estoy accediendo a los métodos dentro de una clase Java en lugar de JSP. –

+0

@PaulGilfedder El efecto sería el mismo con este enfoque si estuviera en JSP o Java, por lo que podría tener un problema en otro lugar. ¿Estás usando un IDE? Si es así, ¿da algún error? – Jonny

+0

@PaulGilfedder eso es extraño. ¿Cuál es la versión del Liferay que estás usando? Liferay EE ou CE? ¿Hay algún SP en él? – brandizzi

1

Al ejecutar el servicio-generador, se genera un archivo jar para acceder desde otros portlets.

De forma predeterminada, el jar de la API del servicio generado se incluirá dentro del archivo war de portlet. Pero si desea que otras aplicaciones accedan a sus servicios, entonces el archivo api jar del servicio debe estar allí en el classpath del servidor. Puede hacerlo cambiando la preferencia a la que se puede acceder haciendo clic en el botón "Preferencias".(Fig: 6)

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

Cuestiones relacionadas