2011-06-08 11 views
5

Estoy tratando de crear un many-to-many entre mi propia entidad y la entidad del grupo liferay. Mi service.xml se parece a estoLiferay Service Builder - many-to-many relaciones

<entity name="EntityA" local-service="true" remote-service="false"> 

    <column name="entityAId" type="long" primary="true" /> 

    <column name="title" type="String" /> 
    <column name="summary" type="String" /> 
    <column name="authorId" type="long" /> 

    <column name="attachments" type="Collection" entity="EntityAAttachment" mapping-key="entityAId" /> 
    <column name="groups" type="Collection" entity="com.liferay.portal.Group" mapping-table="EntityAs_Groups" /> 

</entity> 

De acuerdo con la DTD del service.xml esto debe generar una relación de muchos a muchos, pero yo sólo conseguir este

Method public java.util.List com.liferay.portal.tools.servicebuilder.ServiceBuilder.getMappingEntities(java.lang.String) throws java.io.IOException threw an exception when invoked on [email protected] 
The problematic instruction: 
---------- 
==> list serviceBuilder.getMappingEntities(column.mappingTable) as mapColumn [on line 201, column 49 in com/liferay/portal/tools/servicebuilder/dependencies/model_impl.ftl] 
---------- 
Java backtrace for programmers: 
---------- 
freemarker.template.TemplateModelException: Method public java.util.List com.liferay.portal.tools.servicebuilder.ServiceBuilder.getMappingEntities(java.lang.String) throws java.io.IOException threw an exception when invoked on com.liferay.portal.tools.servicebuilder.Serv[email protected] 
    at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:130) 
    at freemarker.core.MethodCall._getAsTemplateModel(MethodCall.java:93) 
    at freemarker.core.Expression.getAsTemplateModel(Expression.java:89) 
    at freemarker.core.IteratorBlock.accept(IteratorBlock.java:94) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.MixedContent.accept(MixedContent.java:92) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.Environment.visit(Environment.java:299) 
    at freemarker.core.CompressedBlock.accept(CompressedBlock.java:73) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.MixedContent.accept(MixedContent.java:92) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.IfBlock.accept(IfBlock.java:82) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.MixedContent.accept(MixedContent.java:92) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:79) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:179) 
    at freemarker.core.Environment.visit(Environment.java:417) 
    at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.MixedContent.accept(MixedContent.java:92) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.Environment.process(Environment.java:190) 
    at freemarker.template.Template.process(Template.java:237) 
    at com.liferay.portal.freemarker.FreeMarkerUtil.process(FreeMarkerUtil.java:49) 
    at com.liferay.portal.freemarker.FreeMarkerUtil.process(FreeMarkerUtil.java:39) 
    at com.liferay.portal.tools.servicebuilder.ServiceBuilder._processTemplate(ServiceBuilder.java:4447) 
    at com.liferay.portal.tools.servicebuilder.ServiceBuilder._createModelImpl(ServiceBuilder.java:2420) 
    at com.liferay.portal.tools.servicebuilder.ServiceBuilder.<init>(ServiceBuilder.java:1023) 
    at com.liferay.portal.tools.servicebuilder.ServiceBuilder.<init>(ServiceBuilder.java:404) 
    at com.liferay.portal.tools.servicebuilder.ServiceBuilder.main(ServiceBuilder.java:176) 
Caused by: java.lang.NullPointerException 
    at com.liferay.portal.tools.servicebuilder.ServiceBuilder.getMappingEntities(ServiceBuilder.java:1366) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:840) 
    at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:106) 
    ... 32 more 

Lo que estoy haciendo mal aquí? Estoy usando la última Liferay stable 6.0.5

+0

no encuentro una solución a esto. Parece que esto no es compatible con el creador de servicios. – onigunn

+0

Estoy teniendo el mismo problema al intentar algo similar con mi propia entidad y entidad de organización de Liferay. Increíblemente, si nombro la tabla de asignación "Foo_Organization" (copiando directamente de la ayuda), pasa ese punto. Eventualmente recibo un error de compilación en MyEntityModelImpl.java. – jalopaba

+0

¿Alguien ha encontrado una solución? – aeracode

Respuesta

-1

Lferay grupo de entidades, servicios e implementaciones están en el portal-impl.jar que está bajo ROOT/WEB-INF/lib, así que si usted está tratando de utilizar esa entidad su aplicación y el servicio son de ámbito, entonces tiene dos opciones, ya sea mover portal-impl a la ruta de clase global de su tiempo de ejecución (que es una mala elección porque tendrá que mover todas las otras librerías también) o mover portal-impl a la ruta de clase de su portlet (que también es una mala elección) .. La mejor solución es usar un hook para que portal-impl sea accesible..luego mover la lib que genera el generador de servicios a la ruta de clase global de su servidor tomcat/lib/ext para estará en el alcance de su portlet. Me funciona bien. Añadir una referencia antes de encerrar a su entidad

<reference package-path="com.liferay.portal" entity="Group" /> 
  1. desplegar el gancho
  2. que va a generar las tablas necesarias
  3. parada Tomcat
  4. Mueva el lib a la ruta de clase mundial
  5. reiniciar Tomcat
0

Esto es un resolver d error en Liferay: https://issues.liferay.com/browse/LPS-49769

Cambiar el orden lexicográfico de sus entidades podría resolver este problema pero resolverlo con un código fuente incorrecto.

solución potencial por Mike Lenox en https://www.liferay.com/community/forums/-/message_boards/message/41347203:

posible solución: Tengo un modelo grande con un montón de -muchos-a-muchos mapeos que siempre funcionaba bien. Eventualmente tropecé con en este error al agregar una nueva asignación. Finalmente noté que algunos de mis relaciones deberían haber desencadenado el error, pero no lo hice (el orden lexigráfico fue mayor que). Al principio no pude entender por qué funcionaban los antiguos, pero los nuevos fallaban. Resulta que si tiene un back-to many-to-many en la entidad de destino, el constructor funciona bien.

Por ejemplo, añadir un atributo fooList a FooBar para corresponder a la fooBarList en Foo, ambos utilizan el mismo mapeo de la tabla ..

supongo que esto sólo funcionaría durante 2 entidades personalizadas a menos que se modifique LR.

Otra solución consiste en definir el mapeo a sí mismo como una entidad, como lo sugiere http://blog.d-vel.com/home/-/blogs/service-builder-e-relazioni-many-to-many (en italiano):

<entity name="Autore_Libro" local-service="true"> 
<column name="autoreId" type="long" primary="true" /> 
<column name="libroId" type="long" primary="true" /> 
</entity> 
0

Estoy bastante seguro de que no puede hacer uno-a-muchos ni muchos- relación de muchos a muchos entre sus entidades y entidades de portal. Al menos no directamente usando el Service Builder. Tenga en cuenta que su portlet y el portal son contextos separados.

Y como se sugiere en otra respuesta, NO. NUNCA te metas con el portal-impl.jar. Está muy desaconsejado.

Sugeriría simular esta relación implementando los métodos requeridos en las clases EntityAServiceImpl y EntityALocalServiceImpl. Creo que esta será la manera más limpia de ir.

Tener un vistazo a esto ..

https://dev.liferay.com/develop/tutorials/-/knowledge_base/6-2/writing-local-service-classes

Espero que ayude

Cuestiones relacionadas