Liferays Service Builder - отношения многие ко многим - PullRequest
5 голосов
/ 08 июня 2011

Я пытаюсь создать many-to-many между моей собственной сущностью и сущностью группы Liferay. Мой service.xml выглядит так

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

Согласно DTD файла service.xml это должно генерировать отношение «многие ко многим», но я получаю только это

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.ServiceBuilder@21ff3fcf
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.ServiceBuilder@21ff3fcf
    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

Что я здесь не так делаю? Я использую последнюю Liferay stable 6.0.5

Ответы [ 4 ]

0 голосов
/ 04 февраля 2016

Я почти уверен, что вы не можете установить отношения один-ко-многим или многие-ко-многим между вашими сущностями и сущностями портала.По крайней мере, напрямую с помощью Service Builder.Учтите, что ваш портлет и портал - это разные контексты.

И, как предлагается в другом ответе, НЕТ.НИКОГДА не связывайтесь с portal-impl.jar.Настоятельно не рекомендуется.

Я бы предложил смоделировать эту взаимосвязь, реализуя необходимые методы в классах EntityAServiceImpl и EntityALocalServiceImpl.Я думаю, что это будет самый чистый путь.

Взгляните на это ..

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

Надеюсь, что поможет

0 голосов
/ 09 февраля 2013

Объект, сервис и реализации группы Lferay находятся в portal-impl.jar, который находится в ROOT / web-inf / lib, поэтому, если вы пытаетесь использовать этот объект, их реализация и сервис выходят за рамки, тогда у вас есть два выбор: либо вы переместите portal-impl в глобальный путь к классу вашей среды выполнения (что является плохим выбором, потому что вам придется перемещать и все остальные библиотеки), либо вы переместите portal-impl в путь к классу портлета (что является плохим выбором) тоже).. Лучшее решение - использовать hook, чтобы портал-impl был доступен .. затем переместите библиотеку, которую генерирует сервис-строитель, в глобальный путь классов вашего сервера tomcat / lib / ext, чтобы он попадал в область действия вашего портлета .Он отлично работает для меня. Добавьте ссылку перед включением вашей сущности

<reference package-path="com.liferay.portal" entity="Group" />
  1. развернуть крюк
  2. сгенерирует необходимые таблицы
  3. Стоп кота
  4. Переместить библиотеку в глобальный путь к классам
  5. перезагрузить Tomcat
0 голосов
/ 01 февраля 2016

Это нерешенная ошибка в Liferay: https://issues.liferay.com/browse/LPS-49769

Изменение лексикографического порядка ваших сущностей может решить эту проблему, но разрешить ее в некорректном сгенерированном исходном коде.

Потенциальный обходной путь Майка Ленокса при https://www.liferay.com/community/forums/-/message_boards/message/41347203:

Возможный обходной путь: у меня есть большая модель с кучей сопоставления "многие ко многим", которые всегда работали нормально. Я в итоге споткнулся через эту ошибку при добавлении нового сопоставления. Я наконец заметил, что некоторые из моих отношений должен был вызвать ошибку, но не сделал (лексикографический порядок был больше, чем). Сначала я не мог понять, почему старые работали, а новые терпели неудачу. Оказывается, если у вас есть обратное отношение «многие ко многим» в целевом объекте, строителе отлично работает.

Например, добавьте атрибут fooList в FooBar, чтобы соответствовать fooBarList в Foo, оба используют одну и ту же таблицу сопоставления ..

Я полагаю, что это будет работать только для 2 пользовательских объектов, если вы изменить LR.

Еще один обходной путь - определить себя как сущность, как это предлагает http://blog.d -vel.com / home / - / blogs / service-builder-e-relazioni-many-to-many (по-итальянски):

<entity name="Autore_Libro" local-service="true">
 <column name="autoreId" type="long" primary="true" />
 <column name="libroId" type="long" primary="true" />
</entity>
0 голосов
/ 09 июня 2011

для более подробной информации о Liferay Servie builder Проверьте этот пост.

http://liferaydemystified.blogspot.com/2011/04/mvc-portlet-development-service-builder.html

...