调用Liferay Service Builder的XXXLocalServiceUtil会抛出ClassNotFoundException

时间:2014-07-21 10:21:31

标签: java java-ee liferay liferay-6 liferay-ide

我试图从portlet B调用一个XXXLocalServiceUtil方法,该方法是在带有服务构建器的portlet A上创建的。 我在portlet B的/ WEB-INF / lib中导入了完全相同的portlet,但是在日志中似乎抛出了ClassNotFoundException。 有什么想法吗?

  

块引用   13:04:25,904错误[http-bio-8080-exec-77] [render_portlet_jsp:132] null   java.lang.RuntimeException:java.lang.ClassNotFoundException不是有效的异常       at com.liferay.custom.action.service.AuditUserLocalServiceClp.addAuditUser(AuditUserLocalServiceClp.java:763)       at com.liferay.custom.action.service.AuditUserLocalServiceUtil.addAuditUser(AuditUserLocalServiceUtil.java:287)       at com.liferay.calendar.listeners.CalendarBookingListener.onAfterCreate(CalendarBookingListener.java:73)       at com.liferay.calendar.listeners.CalendarBookingListener.onAfterCreate(CalendarBookingListener.java:1)       at com.liferay.portal.model.BaseModelListener.onAfterCreate(BaseModelListener.java:1)       at com.liferay.portal.service.persistence.impl.BasePersistenceImpl.update(BasePersistenceImpl.java:337)       在com.liferay.portal.dao.shard.advice.ShardPersistenceAdvice.invoke(ShardPersistenceAdvice.java:54)       at com.liferay.calendar.service.impl.CalendarBookingLocalServiceImpl.addCalendarBooking(CalendarBookingLocalServiceImpl.java:174)       at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:115)       at com.liferay.portal.spring.transaction.DefaultTransactionExecutor.execute(DefaultTransactionExecutor.java:62)       at com.liferay.portal.spring.transaction.TransactionInterceptor.invoke(TransactionInterceptor.java:51)       at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:111)       at com.liferay.portal.spring.aop.ChainableMethodAdvice.invoke(ChainableMethodAdvice.java:56)       at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:111)       at com.liferay.portal.spring.aop.ChainableMethodAdvice.invoke(ChainableMethodAdvice.java:56)       at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:111)       at com.liferay.portal.spring.aop.ChainableMethodAdvice.invoke(ChainableMethodAdvice.java:56)       at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:111)       at com.liferay.portal.spring.aop.ChainableMethodAdvice.invoke(ChainableMethodAdvice.java:56)       at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:111)   块引用

3 个答案:

答案 0 :(得分:0)

您的XXXLocalServiceUtil仅适用于Portlet A.要使这两个portlet可以使用您的服务,请在服务器级别全局使用它们。

在Tomcat中,您应该将services.jar文件放到/ tomcat / lib / ext,并且不要忘记从portlet本身中删除该JAR。此更改后必须重新启动服务器。

答案 1 :(得分:0)

假设项目的项目/ WAR名称是a-portlet和b-portlet:

a-portlet的服务将在a-service.jar中提供,该a-portlet/WEB-INF/lib位于b-portlet/WEB-INF/liferay-plugin-package.properties。您可以通过编辑required-deployment-contexts=a-portlet 并添加

轻松声明b-portlet在a-portlet上的依赖关系
a-service.jar

这将使a-portlet的a-service.jar可用于b-portlet,并且只有在成功部署了a-portlet时才部署b-portlet。它还将在重新部署a-portlet时重新部署b-portlet。

或者,您可以在全局类路径上使{{1}}可用,但这意味着每次更改服务器时都会重新启动服务器。

答案 2 :(得分:0)

要在portlet A和B之间共享service.jar,请添加

required-deployment-contexts=a-portlet

b-portlet/docroot/WEB-INF/liferay-plugin-package.properties 并且运行所有'它会自动将a-portlet-service.jar放到b-portlet/docroot/WEB-INF/lib。 还有一个细节,portlet必须有不同的包......不要问我为什么......