You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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实例的工作目录后重启。

临时验证方案

如果需要快速确认问题是否由类加载器冲突导致,可以修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:15:05