我试图从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) 块引用
答案 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
并添加
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必须有不同的包......不要问我为什么......