在Liferay DXP中部署时发生类强制转换异常

在Liferay DXP中部署时发生类强制转换异常,liferay,classcastexception,Liferay,Classcastexception,在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.Pr

在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)
[2018-05-17 10:58:33113][DEBUG][10.111.2.74][[http-nio-5443-exec-8][com.fsvps.clientPortal.service.common.ProgramFilterPopulator]-检索登录用户
[2018-05-17 10:58:33137][DEBUG][10.111.2.74][[http-nio-5443-exec-8][com.fsvps.clientPortal.util.common.UserContextInitializationInterceptor]-Portlet模式视图和调试模式=false
[2018-05-17 10:58:33137][DEBUG][10.111.2.74][[http-nio-5443-exec-8][com.fsvps.clientPortal.util.common.UserContextInitializationInterceptor]-检查是否应显示无效的筛选器视图
[2018-05-17 11:07:40859][DEBUG][][[http-nio-5443-exec-2][com.fsvps.clientPortal.util.common.UserContextInitializationInterceptor]-输入
[2018-05-17 11:07:40859][WARN][][[http-nio-5443-exec-2][org.springframework.web.portlet.DispatcherPortlet]-处理程序执行导致异常-转发到已解决的错误视图
java.lang.ClassCastException:com.fsvps.clientPortal.domain.common.UserContext不能强制转换为com.fsvps.clientPortal.domain.common.UserContext
位于com.fsvps.clientPortal.domain.common.UserContext$$FastClassBySpringCGLIB$$818d2483.invoke()
位于org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
位于org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:157)上
位于org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
位于org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:179)上
位于org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
在com.fsvps.clientPortal.domain.common.UserContext$$EnhancerBySpringCGLIB$$830ac420.setIpAddress()上
位于com.fsvps.clientPortal.util.common.UserContextInitializationInterceptor.preHandle(UserContextInitializationInterceptor.java:93)
位于org.springframework.web.portlet.handler.HandlerInterceptorAdapter.preHandleRender(HandlerInterceptorAdapter.java:72)
位于org.springframework.web.portlet.DispatcherPortlet.doRenderService(DispatcherPortlet.java:739)
位于org.springframework.web.portlet.FrameworkPortlet.processRequest(FrameworkPortlet.java:537)
根据您提供的信息,无法查明确切原因。但是,问题的类别很容易识别:

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
对象。

感谢您的响应。我们有什么方法可以防止此错误发生。基本上,此错误正在发生,当我们在Liferay DXP上重新部署应用程序时,由于服务器上的清理操作不正确,内存中会保留两个版本的类…当我们清理服务器时,这个问题会得到解决。但是如果清理服务器,我们所有的缓存都会被破坏,这会在创建新缓存时导致性能问题。请提供帮助。请参阅我的回答中添加的内容谢谢帮助。UserContext对象存储为全局会话