我正在创建一个示例来演示liferay中的关系。我以Book实体和作者为例进行多对多关系。我正在下面的博客中创建此示例。
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)
我想知道这背后的原因。
我希望所涉及的类在类路径上两次出现-与David Nebinger在这篇帖子中回答的类似。他提到的原因是:您可能同时xxx- service.jar在全局类路径中和中使用了您的类WEB-INF/lib,或者可能将您的类放在了全局类路径中WEB- INF/lib并添加WEB-INF/service为源文件夹,以便WEB-INF/classes再次放入相同的类。
xxx- service.jar
WEB-INF/lib
WEB- INF/lib
WEB-INF/service
WEB-INF/classes
每当我看到类加载器的问题,即一个类不能类型转换到其合法的超类或接口时,这就是类路径上重复类的问题。在远古时代,这还包括一个荒谬的消息,即一个Java对象不是java.lang.Object的后代- 显然是错误的,但这意味着在类路径上的 另一个 java.lang.Object。
棘手的事情是,他们需要一些特定的实例化顺序,这些实例化顺序并不总是很容易随便复制。如果发现总是收到消息的情况,则可能总是以相同的方式失败。Liferay服务构建器中的多对多关系可能是触发这些问题的一种方式。