webservlet注解无效访问servlet接口时报404解决办法

 更新时间:2025年06月24日 09:00:48   作者:还航  
这篇文章主要介绍了webservlet注解无效访问servlet接口时报404的解决办法,如果在配置@WebServlet注解后出现404错误,通常是由于URL映射不正确或Servlet类没有正确加载,文中通过代码介绍的非常详细,需要的朋友可以参考下

一.如果用xml可以访问,注解出现404错误时,可能有以下原因

问题类型

错误现象

核心原因

解决关键步骤

404 错误(注解无效)

使用@WebServlet注解时访问路径返回 404,XML 配置正常。

Tomcat 安装路径包含中文,导致类加载和注解扫描异常。

1. 将 Tomcat 和项目路径改为全英文;2. 确认web.xml未禁用注解扫描(metadata-complete=false)。

500 错误(类缺失)

部署后报ClassNotFoundException: javax.servlet.http.HttpServlet。

Tomcat 10 + 基于 Jakarta EE 5.0,代码仍使用旧javax.servlet包,依赖不兼容。

1. 将所有javax.servlet导入替换为jakarta.servlet;2. 添加 Jakarta Servlet 5.0 依赖。

部署冲突(映射重复)

启动时报IllegalArgumentException,提示 URL 模式被重复映射。

同时使用@WebServlet注解和web.xml配置同一个 URL 路径,导致配置冲突。

统一配置方式:仅保留注解或仅保留 XML 配置,删除冲突的配置。

问题 1:@WebServlet 注解无效,404 错误

  • 现象:使用@WebServlet(urlPatterns = {"/pig"})注解配置 Servlet,访问http://localhost:8080/demo05/pig返回 404,但 XML 配置可正常访问。
  • 原因分析

    路径中文问题:Tomcat 安装路径包含中文(如D:\java相关文件\...),导致日志乱码和类加载失败。

    注解扫描禁用:web.xml中metadata-complete=true(默认false,用户未显式设置,但路径问题优先导致扫描失败)。

  • 解决步骤

    修正路径:将 Tomcat 和项目目录移至全英文路径(如D:\java_resources\tocket10\...)。

    检查 web.xml:确保metadata-complete=false(Tomcat 10 默认支持,无需额外配置)。

  • 注意事项
    • Tomcat 对中文路径兼容性差,类加载和资源扫描可能失败。
    • 注解扫描依赖 Servlet 3.0 + 规范,确认容器版本(Tomcat 7 + 支持)。

问题 2:500 内部错误,类缺失异常

Tomcat官方解释

Apache Tomcat ®

欢迎来到 Apache Tomcat® 10.x 软件下载页面。此页面提供获取 Tomcat 10.1.x 软件最新版本的下载链接,以及指向旧版本存档的链接。

 

不确定需要哪个版本?在 “哪个版本?” 页面上可以找到所实现的规范版本、所需的最低 Java 版本以及更多有用信息。

 

使用 Tomcat 10 及更高版本的用户应该注意,由于 Java EE 转移至 Eclipse 基金会过程中从 Java EE 过渡到 Jakarta EE,所有已实现 API 的主包已从 javax.更改为 jakarta.。这几乎肯定需要更改代码,以使应用程序能够从 Tomcat 9 及更早版本迁移到 Tomcat 10 及更高版本。现已开发出一种迁移工具来辅助这一过程

  • 现象:部署后访问 Servlet 报NoClassDefFoundError: javax.servlet.http.HttpServlet。
  • 原因分析:Tomcat 10 + 遵循 Jakarta EE 5.0 规范,原javax.servlet包更名为jakarta.servlet,但代码和依赖仍使用旧包。
  • 解决步骤

    替换包导入

// 旧代码(错误)
import javax.servlet.ServletException;
// 新代码(正确)
import jakarta.servlet.ServletException;
  • 更新 Maven 依赖

<!-- 旧依赖(错误) -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>
<!-- 新依赖(正确,Tomcat 10对应Jakarta 5.0) -->
<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>5.0.0</version>
    <scope>provided</scope>
</dependency>
  • 注意事项
    • Tomcat 版本与 Servlet 规范严格对应:Tomcat 10 → Jakarta Servlet 5.0,Tomcat 11 → Jakarta Servlet 6.0。
    • 避免手动添加旧版javax.servlet-api.jar到WEB-INF/lib,Tomcat 10 + 已内置 Jakarta 依赖。

问题 3:部署冲突,URL 模式重复映射

  • 现象:Tomcat 启动时报IllegalArgumentException: 名为 [PigServlet]和 [com.fhedu.PigServlet] 的servlet不能映射为一个url模式。
  • 原因分析:同时使用@WebServlet注解和web.xml配置同一个 URL 路径(/pig),导致 Tomcat 检测到重复映射。
  • 解决步骤
    • 仅使用注解:删除web.xml中的 Servlet 配置:
<!-- 删除以下内容 -->
<servlet>
    <servlet-name>PigServlet</servlet-name>
    <servlet-class>com.kaka.PigServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>PigServlet</servlet-name>
    <url-pattern>/pig</url-pattern>
</servlet-mapping>
    • 仅使用 XML:删除类上的@WebServlet注解,保留web.xml配置(二选一)。
  • 注意事项
    • 注解和 XML 配置互斥,同一 Servlet 只能通过一种方式注册。
    • 检查 IDE 部署配置,确保无残留旧配置(如手动添加的web.xml未删除)。

二、关键知识点总结

  • 路径规范
    • Tomcat 和项目路径必须为全英文,避免特殊字符,防止类加载和扫描失败。
  • 版本兼容性
    • Tomcat 10 + 使用 Jakarta EE 5.0+,需将javax.servlet替换为jakarta.servlet,依赖版本对应jakarta.servlet-api:5.0.0。
  • 配置统一性
    • 优先使用注解(推荐)或 XML 配置,避免混合使用导致映射冲突。
  • IDE 最佳实践
    • 每次修改后清除缓存(File > Invalidate Caches / Restart),确保部署无残留。
    • 确认 Tomcat 配置中的Application context与访问 URL 一致(如/demo05)。

三、预防措施与参考资料

四、总结

本次问题排查涉及路径兼容性、依赖版本适配和配置统一性三大核心问题。通过逐步定位日志错误、分析类加载冲突和配置规则,最终通过路径修正、依赖升级和配置统一解决了所有问题。后续开发中需注意 Tomcat 版本特性和规范变更,避免类似问题重复发生。

到此这篇关于webservlet注解无效访问servlet接口时报404解决办法的文章就介绍到这了,更多相关webservlet注解无效报404内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java找出1000以内的所有完数

    Java找出1000以内的所有完数

    一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程找出1000以内的所有完数
    2017-02-02
  • Java游戏开发拼图游戏经典版

    Java游戏开发拼图游戏经典版

    这篇文章主要介绍了Java游戏开发拼图游戏经典版,对这方面感兴趣的同学可以跟着教程试下
    2021-01-01
  • SpringBoot中@ConfigurationProperties注解的使用与源码详解

    SpringBoot中@ConfigurationProperties注解的使用与源码详解

    这篇文章主要介绍了SpringBoot中@ConfigurationProperties注解的使用与源码详解,@ConfigurationProperties注解用于自动配置绑定,可以将application.properties配置中的值注入到bean对象上,需要的朋友可以参考下
    2023-11-11
  • Java零基础教程之Windows下安装、启动Tomcat服务器方法图解(免安装版)

    Java零基础教程之Windows下安装、启动Tomcat服务器方法图解(免安装版)

    这篇文章主要介绍了Windows系统下安装、启动、注册服务、停止 Tomcat操作的所有方法,本文通过图文并茂的方式给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2016-09-09
  • Java中Collections.sort的使用

    Java中Collections.sort的使用

    本文主要介绍了Java中Collections.sort的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • MyBatis中的SQL映射文件如何配置参数映射和使用方法

    MyBatis中的SQL映射文件如何配置参数映射和使用方法

    MyBatis 是一种开源的 Java 持久化框架,它可以自动将数据库中的数据映射到 Java 对象中,并且使得 Java 对象可以非常方便地存储到数据库中,本文将介绍 MyBatis 中 SQL 映射文件的参数映射配置和使用方法,需要的朋友可以参考下
    2023-07-07
  • 关于dubbo的超时处理及重试原则

    关于dubbo的超时处理及重试原则

    这篇文章主要介绍了关于dubbo的超时处理及重试原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • SpringBoot+websocket实现消息对话功能

    SpringBoot+websocket实现消息对话功能

    WebSocket是一种在Web应用程序中实现实时双向通信的技术,它可以用于在线游戏、在线聊天、推送通知、实时监控等,并且比传统的轮询技术更加高效和可靠,本文就给大家介绍基于SpringBoot+websocket实现消息对话功能,感兴趣的小伙伴可以自己动手试一试
    2023-09-09
  • Java中两种抛出异常的方式示例详解

    Java中两种抛出异常的方式示例详解

    在Java中有两种抛出异常的方式,一种是throw,直接抛出异常,另一种是throws,间接抛出异常,本文给大家详细说明java中两种抛出异常的方式,感兴趣的朋友一起看看吧
    2023-08-08
  • SpringBoot框架内使用Java调用讯飞星火api完整步骤

    SpringBoot框架内使用Java调用讯飞星火api完整步骤

    近年来人工智能技术已经成为了各行各业中不可或缺的一部分,讯飞星火认知是讯飞科技推出的AI开放平台,为开发者提供了丰富的人工智能技术接口和服务,这篇文章主要介绍了SpringBoot框架内使用Java调用讯飞星火api的相关资料,需要的朋友可以参考下
    2025-05-05

最新评论