生命周期服务构建器中的异常":#34; java.lang.ClassCastException

时间:2014-12-04 05:00:53

标签: java liferay-6 liferay-service-builder

我一直致力于实体实施远程服务。 我在EntityServiceImpl中创建了一个自定义服务方法,创建了通过InstitutionServiceUtil提供服务的自定义服务方法。 在部署了portlet之后,在从浏览器窗口发送请求到服务方法的同时,我得到了Exception

exception":"java.lang.ClassCastException: com.institutions.model.impl.InstitutionImpl 
           cannot be cast to com.institutions.model.Institution

注意:如果我在重启服务器后发送请求,我没有得到上述异常。

如何解决上述异常?

2 个答案:

答案 0 :(得分:3)

我假设InstitutionImpl实现了接口Institution。如果是这样,那么异常的根本原因是类加载:类加载器A加载InstitutionInstitutionImpl是从不同的类加载器加载的。如果完全限定名称类加载器相同,则Java中的两个类只是等效的。

我对liferay的了解不足以告诉你它的类加载是如何工作的。但是要解决这个问题,您需要确定当您尝试加载实现时可能已经存在Institution接口(可能来自之前的部署尝试)。

答案 1 :(得分:1)

在部署抛出类强制转换异常的portlet时,请执行以下操作:

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

    1. 在service.xml文件中构建service.xml时更改包名称
    2. 或者如果您已经构建了服务,请执行以下步骤

      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中的包名称并构建路径。