生命周期服务构建器中的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时,请执行以下操作:

  1. 在liferay / deploy中部署应用程序。
  2. 关闭救生圈
  3. 将服务jar从WEB-INF / lib从portlet移动到tomcat的/ lib / ext
  4. 从tomcat中删除temp和work文件夹
  5. 重启tomcat。

或者…对我有用的是

  1. 在service.xml文件中构建service.xml时更改包名称

或者,如果您已经构建了服务,请执行以下步骤

  1. 只需删除从服务构建器创建的5个包,即

    model.impl

    service.base

    service.http

    service.impl

    service.persistence

  2. 删除META-INF文件夹中生成的.xml,文件ext-spring.xml除外

  3. 从docroot / lib文件夹中删除XX-service.jar
  4. 删除docroot文件夹中的服务文件夹。
  5. 更改service.xml中的包名称并构建路径。