Liferay 多对多 RelationShip 抛出 Class 转换异常

Liferay Many-to-Many RelationShip Throws Class Cast Exception

我正在创建一个示例来演示 liferay.I 中的关系,我正在以多对多的书籍实体和作者为例 relationship.I 我正在关注下面的博客以创建此示例。

http://www.liferaysavvy.com/2014/01/liferay-service-builder-many-to-many_12.html

但是我遇到了 class cast exception.In 博客的问题,它也被写为抛出 class cast 异常。

11:05:00,422 ERROR [RuntimePageImpl-2][render_portlet_jsp:132] null
java.lang.ClassCastException: com.ds.portlet.library.model.impl.AuthorImpl cannot be cast to com.ds.portlet.library.model.Author
        at com.ds.portlet.library.service.persistence.AuthorPersistenceImpl.fetchByPrimaryKey(AuthorPersistenceImpl.java:691)
        at com.ds.portlet.library.service.persistence.AuthorPersistenceImpl.findByPrimaryKey(AuthorPersistenceImpl.java:653)
        at com.ds.portlet.library.service.persistence.AuthorPersistenceImpl.findByPrimaryKey(AuthorPersistenceImpl.java:59)
        at com.liferay.portal.dao.shard.advice.ShardPersistenceAdvice.invoke(ShardPersistenceAdvice.java:54)
        at com.liferay.portal.service.persistence.impl.TableMapperImpl.getBaseModels(TableMapperImpl.java:400)
        at com.liferay.portal.service.persistence.impl.TableMapperImpl.getRightBaseModels(TableMapperImpl.java:265)
        at com.ds.portlet.library.service.persistence.BookPersistenceImpl.getAuthors(BookPersistenceImpl.java:1183)
        at com.ds.portlet.library.service.persistence.BookPersistenceImpl.getAuthors(BookPersistenceImpl.java:1162)
        at com.ds.portlet.library.service.persistence.BookPersistenceImpl.getAuthors(BookPersistenceImpl.java:1143)
        at com.liferay.portal.dao.shard.advice.ShardPersistenceAdvice.invoke(ShardPersistenceAdvice.java:54)
        at com.ds.portlet.library.service.base.AuthorLocalServiceBaseImpl.getBookAuthors(AuthorLocalServiceBaseImpl.java:374)
        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.ServiceBeanAopProxy.invoke(ServiceBeanAopProxy.java:175)
        at com.ds.portlet.library.service.AuthorLocalServiceUtil.getBookAuthors(AuthorLocalServiceUtil.java:321)
        at org.apache.jsp.view_jsp._jspService(view_jsp.java:420)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

我想知道这背后的原因。

我希望所涉及的 classes 在 class 路径上出现两次 - 类似于 David Nebinger 在 this post 中的回答。他提到的原因是:您可能在全局 class 路径和 WEB-INF/lib 路径上都有您的 xxx-service.jar,或者您可能在 WEB-INF/lib 上有它并添加了 WEB-INF/service 作为源文件夹,以便相同的 class 再次出现在 WEB-INF/classes 中。

每当我看到 classloader 问题,即 class 不能被类型转换为其合法的 superclass 或接口,这是一个重复 class 的问题es 在 class 路径上。在过去,这还包括一个荒谬的消息,即 java 对象不是 java.lang.Object 的后代 - 显然是错误的,但这意味着 另一个 java.lang.Object 在 class 路径上。

棘手的是,他们需要一些特定的实例化顺序,而这些顺序并不总是很容易自愿复制。如果您发现总能收到消息的情况,它很可能总是以同样的方式失败。 Liferay 的服务构建器中的多对多关系可能是引发这些问题的一种方式。