当我们在Liferay DXP 7中部署任何应用程序时,我们会遇到以下错误。
当我们清理Liferay DXP然后重新部署以下问题得到修复。 但是这种方法的问题在于清理后所有缓存都被删除,当我们重新部署和访问网站时,缓存会被重新创建,但访问网站上的任何页面需要很多时间。
[2018-05-17 10:58:33,113] [DEBUG] [10.111.2.74] [] [http-nio-5443-exec-8] [com.fsvps.clientPortal.service.common.ProgramFilterPopulator] - Retrieving logged in user
[2018-05-17 10:58:33,137] [DEBUG] [10.111.2.74] [] [http-nio-5443-exec-8] [com.fsvps.clientPortal.util.common.UserContextInitializationInterceptor] - Portlet mode view and debug mode = false
[2018-05-17 10:58:33,137] [DEBUG] [10.111.2.74] [] [http-nio-5443-exec-8] [com.fsvps.clientPortal.util.common.UserContextInitializationInterceptor] - Checking to see if invalid filter view should be shown
[2018-05-17 11:07:40,859] [DEBUG] [] [] [http-nio-5443-exec-2] [com.fsvps.clientPortal.util.common.UserContextInitializationInterceptor] - Entering
[2018-05-17 11:07:40,859] [WARN] [] [] [http-nio-5443-exec-2] [org.springframework.web.portlet.DispatcherPortlet] - Handler execution resulted in exception - forwarding to resolved error view
java.lang.ClassCastException: com.fsvps.clientPortal.domain.common.UserContext cannot be cast to com.fsvps.clientPortal.domain.common.UserContext
at com.fsvps.clientPortal.domain.common.UserContext$$FastClassBySpringCGLIB$$818d2483.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
at com.fsvps.clientPortal.domain.common.UserContext$$EnhancerBySpringCGLIB$$830ac420.setIpAddress(<generated>)
at com.fsvps.clientPortal.util.common.UserContextInitializationInterceptor.preHandle(UserContextInitializationInterceptor.java:93)
at org.springframework.web.portlet.handler.HandlerInterceptorAdapter.preHandleRender(HandlerInterceptorAdapter.java:72)
at org.springframework.web.portlet.DispatcherPortlet.doRenderService(DispatcherPortlet.java:739)
at org.springframework.web.portlet.FrameworkPortlet.processRequest(FrameworkPortlet.java:537)
答案 0 :(得分:1)
确切的原因无法根据您提供的信息查明。但是,这类问题很容易识别:
java.lang.ClassCastException:
com.fsvps.clientPortal.domain.common.UserContext cannot be cast to
com.fsvps.clientPortal.domain.common.UserContext
(分隔成行以说明相同的类名)
每当一个类不能被本身或一个合法的超类/接口强制转换时,你就会处理重复的代码:这个类的两个版本具有相同的名称可用于类加载器,系统正在选择它们。
由于错误消息只包含类的名称,而不是其类加载器,因此第一眼看错误消息是没有意义的。知道一个类是由它的包唯一描述的,名称,和它的类加载器会引导你找到根本原因。
确定您的模块并确保com.fsvps.clientPortal.domain.common.UserContext
只有一个选项可用。
编辑:回答您的评论 - 在不知道您的部署详情的情况下,除了疯狂的猜测之外,没有办法帮助您。如果下一个猜测没有帮助,请在您的问题中添加更多信息:
该类的名称UserContext
表示您可以将其存储在某个位置,例如在一个会话中。这样做会在您取消部署插件时阻止原始类卸载。 请注意,取消部署代码和垃圾收集对象之间存在巨大差异:GC只能在没有更多引用的情况下发生。
如果部署了插件的更新版本,旧的和现有的对象仍然引用先前加载的UserContext
类,而新代码则尝试将其分配给新的UserContext
引用。尽管可能在实现方面相同,但它们只是共享名称的不同类。
您无法对可能取消部署的代码保留长期生命引用,并期望它们保持可用。快速修复(如果您正在部署OSGi模块)可能是将稳定且长期使用的类提取到您不能重新部署的自己的包中。或者用Java运行时类替换会话存储对象(假设这是它),例如内置类型的映射,并在需要时从这些类型构建UserContext
对象。