2011-06-08 36 views
5

我试图在我自己的实体和liferay Group实体之间创建一个many-to-many。我service.xml中看起来像这样Liferays Service Builder - 多对多关系

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

我在做什么这里错了吗?我正在使用最新的Liferay stable 6.0.5

+0

我没有找到一个解决这个。似乎这不受服务构建器支持。 – onigunn 2011-07-14 19:23:58

+0

我遇到同样的问题,尝试类似于我自己的实体和liferay组织实体。令人难以置信的是,如果我将映射表命名为“Foo_Organization”(直接从帮助中复制),它会通过该点。我最终在MyEntityModelImpl.java中得到编译错误。 – jalopaba 2011-10-20 15:20:41

+0

有没有人找到解决方案? – aeracode 2012-09-25 11:53:53

回答

-1

Lferay组实体,服务和实现在门户impl.jar中这是在ROOT/WEB-INF/lib目录,所以如果你要使用该实体的实施和服务是出范围,那么您有两种选择,要么将portal-impl移动到运行时的全局类路径(这是一个错误的选择,因为您必须移动所有其他库),要么将portal-impl移动到portlet类路径(这也是一个不错的选择)。 最好的解决方案是使用hook,这样portal-impl就可以访问了。然后将service-builder生成的lib移动到服务器tomcat/lib/ext的全局类路径中它将在你的portlet的范围内,对我来说工作正常。 封闭的实体之前添加引用

<reference package-path="com.liferay.portal" entity="Group" /> 
  1. 部署钩
  2. 就会产生所需的表
  3. 停止Tomcat
  4. 移动lib添加到全局类路径
  5. 重新启动Tomcat
0

这是一个unresolve d bug在Liferay中:https://issues.liferay.com/browse/LPS-49769

更改您的实体的字典顺序可能会解决此问题,但解决不正确的生成的源代码。

潜在的解决方法由麦克·伦诺克斯在https://www.liferay.com/community/forums/-/message_boards/message/41347203

潜在的解决方法:我有一帮 许多一对多映射总是能正常工作大模型。添加新映射时,我最终在此错误中偶然发现了 。我终于注意到,我的一些关系 应该已经触发了这个bug,但没有 (lexigraphic顺序大于)。起初我找不出 为什么旧的工作,但新的失败。事实证明,如果 在目标实体中存在多对多的情况,那么构建器 可以正常工作。

例如,添加fooList属性FooBar的以对应于美孚的 fooBarList,使用相同的映射表既..

我想,这可能仅仅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

我敢肯定你不能让一个一对多也不是多对一您的实体和门户实体之间的多对多关系。至少不直接使用Service Builder。考虑到你的portlet和门户是独立的上下文。

而且正如其他答案中所建议的,切勿与portal-impl.jar混淆。它非常沮丧。

我会建议模拟这种关系在EntityAServiceImpl和EntityALocalServiceImpl类中实现所需的方法。我认为这将是最干净的方式。

看一看这个..

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

希望帮助