如何解决java.lang.ClassCastException: net.sf.json.JSONObject无法强转同名类问题
问题解决方案
根因说明
你遇到的net.sf.json.JSONObject cannot be cast to net.sf.json.JSONObject异常本质是类加载器冲突:全限定名完全相同的类被不同的类加载器分别加载,JVM会判定这两个类是不同类型,因此强转失败。
在你的Servlet+JSP场景下,View.class由Web应用的类加载器加载,Render.jsp编译后的业务代码由Jasper类加载器加载,二者加载json-lib包的来源不同就会触发该冲突。
修复步骤
- 排查jar包存放位置,保证
json-lib-0.9.jar以及其依赖的commons-beanutils、commons-collections、commons-lang、commons-logging、ezmorph包仅在当前Web应用的WEB-INF/lib目录下存在一份,删除Web容器(如Tomcat)全局lib目录、JDK扩展目录jre/lib/ext下的重复json-lib相关包。 - 清理项目与容器缓存后重启:
- 独立部署Tomcat时,删除Tomcat的
work目录下所有缓存内容,删除webapps下已部署的应用目录,重新打包部署项目后启动Tomcat。 - IDE内启动时,执行Rebuild Project清理项目编译缓存,再清理对应Tomcat实例的工作目录后重启。
- 独立部署Tomcat时,删除Tomcat的
临时验证方案
如果需要快速确认问题是否由类加载器冲突导致,可以修改Render.jsp代码,规避跨类加载器的类强转逻辑:
<%@page import="net.sf.json.JSONObject" %> <% Object metaObj = request.getAttribute("META"); JSONObject docMeta = JSONObject.fromObject(metaObj.toString()); %>
额外注意
你提供的View.class代码中request.setAttribute("META", Json.get("META"))需要确认Json中取出的META字段确实为JSONObject类型,避免本身存储类型不符导致的强转失败。
内容的提问来源于stack exchange,提问作者user3629
相关产品推荐
相关产品推荐

