Liferay Serivce Builder:无法运行动态查询

时间:2017-03-28 10:30:52

标签: liferay liferay-service-builder

我有两个插件portlet。首先是包含所有实体的服务构建器。第二个portlet正在使用服务的jar文件来执行动态查询。

我在第二个插件portlet中使用第一个服务jar来与数据库进行交互。但是在这个jar文件中没有任何Impl类。这就是为什么我得到错误Impl Class未找到。 以下是供参考:

DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(XXX.class,
PortletClassLoaderUtil.getClassLoader());
try {
    XXXLocalServiceUtil.dynamicQuery(dynamicQuery);
} catch (SystemException e1) {
  // TODO Auto-generated catch block
  e1.printStackTrace();
}

错误: [DynamicQueryFactoryImpl:96]无法找到模型com.compass.model.impl.XXXImpl java.lang.ClassNotFoundException:com.compass.model.impl.XXXImpl

正常功能正常服务构建器

3 个答案:

答案 0 :(得分:5)

只是不要使用 DynamicQueryFactoryUtil ,而是使用XXXLocalServiceUtil这样

DynamicQuery dynamicQuery = XXXLocalServiceUtil.dynamicQuery() 
try {
    XXXLocalServiceUtil.dynamicQuery(dynamicQuery);
} catch (SystemException e1) {
  // TODO Auto-generated catch block
  e1.printStackTrace();
}

如果你想使用工厂,你必须使用接口模型而不是实体的impl,所以如果你有一个实体FooImpl起诉Foo.class并使用你的服务插件portlet的类别

Classloader cl =(ClassLoader) PortletBeanLocatorUtil.locate("services-portlet", "portletClassLoader");
DynamicQueryFactoryUtil.forClass(XXX.class, cl);

答案 1 :(得分:1)

两者都适合我......

ClassLoader classLoader = (ClassLoader)PortletBeanLocatorUtil.locate(ClpSerializer.getServletContextName(), "portletClassLoader");

OR

ClassLoader classLoader = PortletBeanLocatorUtil.getBeanLocator(ClpSerializer.getServletContextName()).getClassLoader();

DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(charges.class,classLoader);

谢谢@Romeo。

答案 2 :(得分:0)

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <h3>Vue app : </h3>
  Counter : 
  {{ counter }}
</div>




<h3>Outside of vue : </h3>

<button onclick="inc()">
  Inc
</button>

这对我有用!!!!