生命周期服务构建器中的exception“:”java.lang.ClassCastException
我一直在努力实现Entity远程服务。 我在EntityServiceImpl中创建了一个自定义服务方法,创建了通过InstitutionServiceUtil提供服务的自定义服务方法。 在部署了portlet之后,在从浏览器窗口发送请求到服务方法的同时,我得到了Exception
exception":"java.lang.ClassCastException: com.institutions.model.impl.InstitutionImpl cannot be cast to com.institutions.model.Institution
注意:如果我在重启服务器后发送请求,我没有得到上述exception。
如何解决上述exception?
我假设InstitutionImpl
实现了Institution
接口。 如果是这样,那么exception的根本原因是类加载:类加载器A确实加载了Institution
但是InstitutionImpl
是从不同的类加载器加载的。 如果完全限定名称和类加载器相同,则Java中的两个类只是等效的。
我不太了解liferay告诉你它的类加载是如何工作的。 但是要解决这个问题,您需要确定当您尝试加载实现时(可能来自之前的部署尝试), Institution
接口是否已经存在。
在部署抛出类强制转换exception的portlet时,请执行以下操作:
- 在liferay / deploy中部署应用程序。
- 关闭救生圈
- 将服务jar从WEB-INF / lib从portlet移动到tomcat的/ lib / ext
- 从tomcat中删除temp和work文件夹
- 重启tomcat。
或者…对我有用的是
- 在service.xml文件中构建service.xml时更改包名称
或者,如果您已经构建了服务,请执行以下步骤
-
只需删除从服务构建器创建的5个包,即
model.impl
service.base
service.http
service.impl
service.persistence
-
删除META-INF文件夹中生成的.xml,文件ext-spring.xml除外
- 从docroot / lib文件夹中删除XX-service.jar
- 删除docroot文件夹中的服务文件夹。
- 更改service.xml中的包名称并构建路径。