Liferay多对多关系引发类强制异常

时间:2015-05-25 11:14:44

标签: java liferay portlet

我正在创建一个展示liferay中关系的例子。我正在以书籍实体和作者的身份进行多对多的关系。我在下面的博客中创建了这个例子。

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

但我遇到了类强制转换异常的问题。在博客中也有人写过,它正在抛出类强制转换异常。

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)

我想知道背后的原因。

1 个答案:

答案 0 :(得分:0)

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

每当我看到类加载器问题,类不能被类型化为其合法的超类或接口时,这就是类路径上的重复类的问题。在古代,这还包括一个荒谬的消息,即java对象不是java.lang.Object的后代 - 显然是错误的,但它意味着另一个 java.lang.Object类路径。

棘手的是,他们需要一些特定的实例化顺序,并不总是很容易重现。如果您发现某种情况下您将始终收到该消息,则可能始终以相同的方式失败。 Liferay的服务构建者中的多对多关系可能是触发这些问题的一种方式。