java.lang.ClassCastException: org.apache.catalina.util.DefaultAnnotationProcessor 访问jsp报错-过滤器报错...

本文介绍了在使用Tomcat部署项目时遇到的java.lang.ClassCastException异常问题,特别是针对org.apache.catalina.util.DefaultAnnotationProcessor引发的错误。提供了两种解决方法:删除项目中冗余的catalina.jar文件或修改context.xml配置。

java.lang.ClassCastException: org.apache.catalina.util.DefaultAnnotationProcessor 访问jsp报错 过滤器异常



07:16:33,911 ERROR CharsetEncoding:38 - java.lang.ClassCastException: org.apache.catalina.util.DefaultAnnotationProcessor
org.apache.jasper.JasperException: java.lang.ClassCastException: org.apache.catalina.util.DefaultAnnotationProcessor
	at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:356)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at com.****.CharsetEncoding.doFilter(CharsetEncoding.java:30)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassCastException: org.apache.catalina.util.DefaultAnnotationProcessor
	at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)


解决方案1:
当项目中引用tomcat目录下面的lib下面的catalina.jar的时候,用myeclipse将项目部署到tomcat下面的时候,会将catalina.jar包加到项目的web-inf下面的lib文件夹下面,这样这个包就会和tomcat下面的lib下面的catalina.jar包冲突会报java.lang.ClassCastException: org.apache.catalina.util.DefaultAnnotationProcessor错误,解决方法是将项目部署到tomcat下面后,将项目的web-inf/lib下面的catalina.jar删掉,然后在重启tomcat,ok。

方案2:
修改了tomcat里的context.xml文件,在context 元素下添加
<Context>
<Loader delegate="true" />



Connected to server [2025-06-09 08:34:00,303] Artifact experiment-3test:war exploded: Artifact is being deployed, please wait... 09-Jun-2025 08:34:00.768 信息 [RMI TCP Connection(2)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 09-Jun-2025 08:34:00.792 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal 一个或多个筛选器启动失败。完整的详细信息将在相应的容器日志文件中找到 09-Jun-2025 08:34:00.793 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal 由于之前的错误,Context[/experiment_3test_war_exploded]启动失败 [2025-06-09 08:34:00,804] Artifact experiment-3test:war exploded: Error during artifact deployment. See server log for details. 09-Jun-2025 08:34:09.840 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\TOMCAT\apache-tomcat-10.1.36-windows-x64\apache-tomcat-10.1.36\webapps\manager] 09-Jun-2025 08:34:10.070 信息 [Catalina-utility-1] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 09-Jun-2025 08:34:10.090 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\TOMCAT\apache-tomcat-10.1.36-windows-x64\apache-tomcat-10.1.36\webapps\manager]的部署已在[250]毫秒内完成
06-10
你遇到的错误是: ``` java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long ``` 这个错误说明你尝试将一个 `Integer` 类型的对象强制转换为 `Long` 类型,这是不允许的,因为它们是不同的类型。 --- ## ✅ 错误原因分析 Java 中,`Integer` 和 `Long` 都是 `Number` 的子类,但它们不能直接相互强制转换,例如: ```java Object obj = 123; // Integer 类型 Long l = (Long) obj; // 报错ClassCastException ``` --- ## ✅ 完整修复代码(基于你之前的代码) 我们假设你在如下代码中遇到了这个错误: ```java node.setCount((Integer) detail.get("count")); // 这一行报错 ``` 而 `setCount()` 方法的参数类型是 `Long`: ```java public void setCount(Long count) { this.count = count; } ``` 这就导致了 `Integer` 被强制转换为 `Long`,从而抛出 `ClassCastException`。 --- ## ✅ ✅ ✅ 正确修复方式(完整代码) ### 1. 修改 `DsAssetsTreeNodeDTO` 类中的 `setCount()` 方法 确保 `setCount()` 接受 `Long` 类型: ```java private Long count; public Long getCount() { return count; } public void setCount(Long count) { this.count = count; } ``` --- ### 2. 修改 `buildFromMap()` 中的类型转换逻辑 使用 `Optional` 安全地处理 `Integer` 到 `Long` 的转换: ```java Optional.ofNullable(detail.get("count")) .map(Object::toString) // 转成字符串避免类型错误 .map(Long::valueOf) // 再转成 Long .ifPresent(node::setCount); ``` 或者你也可以使用更精确的判断: ```java Object countObj = detail.get("count"); if (countObj != null) { if (countObj instanceof Integer) { node.setCount(((Integer) countObj).longValue()); } else if (countObj instanceof Long) { node.setCount((Long) countObj); } else { try { node.setCount(Long.valueOf(countObj.toString())); } catch (NumberFormatException ignored) { // 忽略非法数字 } } } ``` --- ## ✅ 示例:完整 `buildFromMap()` 方法(修复版) ```java public static List<DsAssetsTreeNodeDTO> buildFromMap( Map<String, Map<String, Map<String, Map<String, Object>>>> data) { List<DsAssetsTreeNodeDTO> result = new ArrayList<>(); if (data == null) return result; for (Map.Entry<String, Map<String, Map<String, Map<String, Object>>>> areaEntry : data.entrySet()) { String areaName = areaEntry.getKey(); Map<String, Map<String, Map<String, Object>>> dimensionMap = areaEntry.getValue(); if (dimensionMap == null) continue; DsAssetsTreeNodeDTO areaNode = new DsAssetsTreeNodeDTO(areaName, areaName); for (Map.Entry<String, Map<String, Map<String, Object>>> dimEntry : dimensionMap.entrySet()) { String dimensionName = dimEntry.getKey(); Map<String, Map<String, Object>> valueMap = dimEntry.getValue(); if (valueMap == null) continue; DsAssetsTreeNodeDTO dimNode = new DsAssetsTreeNodeDTO(dimensionName, dimensionName); for (Map.Entry<String, Map<String, Object>> valueEntry : valueMap.entrySet()) { String valueName = valueEntry.getKey(); Map<String, Object> detail = valueEntry.getValue(); if (valueName == null || detail == null) continue; DsAssetsTreeNodeDTO valueNode = new DsAssetsTreeNodeDTO(valueName, valueName); // 安全获取 count(处理 Integer -> Long) Object countObj = detail.get("count"); if (countObj != null) { if (countObj instanceof Integer) { valueNode.setCount(((Integer) countObj).longValue()); } else if (countObj instanceof Long) { valueNode.setCount((Long) countObj); } else { try { valueNode.setCount(Long.valueOf(countObj.toString())); } catch (NumberFormatException ignored) { // 忽略非法数字 } } } // 安全获取 details Optional.ofNullable(detail.get("details")) .filter(obj -> obj instanceof List<?>) .map(obj -> (List<String>) obj) .ifPresent(valueNode::setDetails); dimNode.getChildren().add(valueNode); } areaNode.getChildren().add(dimNode); } result.add(areaNode); } return result; } ``` --- ## ✅ 总结 | 问题 | 原因 | 解决方案 | |------|------|-----------| | `ClassCastException: Integer to Long` | 强制类型转换错误 | 使用类型判断 + 安全转换 | | `detail.get("count")` 类型不确定 | 数据来源不一致 | 使用 `instanceof` 判断 | | 使用 `Long.valueOf()` 或 `.longValue()` | 避免直接强制转换 | 更加安全 | | 使用 `Optional` | 提高代码可读性 | 推荐使用 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值