webservlet注解無效訪問servlet接口時(shí)報(bào)404解決辦法
一.如果用xml可以訪問,注解出現(xiàn)404錯(cuò)誤時(shí),可能有以下原因
問題類型 | 錯(cuò)誤現(xiàn)象 | 核心原因 | 解決關(guān)鍵步驟 |
404 錯(cuò)誤(注解無效) | 使用@WebServlet注解時(shí)訪問路徑返回 404,XML 配置正常。 | Tomcat 安裝路徑包含中文,導(dǎo)致類加載和注解掃描異常。 | 1. 將 Tomcat 和項(xiàng)目路徑改為全英文;2. 確認(rèn)web.xml未禁用注解掃描(metadata-complete=false)。 |
500 錯(cuò)誤(類缺失) | 部署后報(bào)ClassNotFoundException: javax.servlet.http.HttpServlet。 | Tomcat 10 + 基于 Jakarta EE 5.0,代碼仍使用舊javax.servlet包,依賴不兼容。 | 1. 將所有javax.servlet導(dǎo)入替換為jakarta.servlet;2. 添加 Jakarta Servlet 5.0 依賴。 |
部署沖突(映射重復(fù)) | 啟動(dòng)時(shí)報(bào)IllegalArgumentException,提示 URL 模式被重復(fù)映射。 | 同時(shí)使用@WebServlet注解和web.xml配置同一個(gè) URL 路徑,導(dǎo)致配置沖突。 | 統(tǒng)一配置方式:僅保留注解或僅保留 XML 配置,刪除沖突的配置。 |
問題 1:@WebServlet 注解無效,404 錯(cuò)誤
- 現(xiàn)象:使用@WebServlet(urlPatterns = {"/pig"})注解配置 Servlet,訪問http://localhost:8080/demo05/pig返回 404,但 XML 配置可正常訪問。
- 原因分析:
路徑中文問題:Tomcat 安裝路徑包含中文(如D:\java相關(guān)文件\...),導(dǎo)致日志亂碼和類加載失敗。
注解掃描禁用:web.xml中metadata-complete=true(默認(rèn)false,用戶未顯式設(shè)置,但路徑問題優(yōu)先導(dǎo)致掃描失敗)。
- 解決步驟:
修正路徑:將 Tomcat 和項(xiàng)目目錄移至全英文路徑(如D:\java_resources\tocket10\...)。
檢查 web.xml:確保metadata-complete=false(Tomcat 10 默認(rèn)支持,無需額外配置)。
- 注意事項(xiàng):
- Tomcat 對(duì)中文路徑兼容性差,類加載和資源掃描可能失敗。
- 注解掃描依賴 Servlet 3.0 + 規(guī)范,確認(rèn)容器版本(Tomcat 7 + 支持)。
問題 2:500 內(nèi)部錯(cuò)誤,類缺失異常
Tomcat官方解釋
Apache Tomcat ®
歡迎來到 Apache Tomcat® 10.x 軟件下載頁面。此頁面提供獲取 Tomcat 10.1.x 軟件最新版本的下載鏈接,以及指向舊版本存檔的鏈接。
不確定需要哪個(gè)版本?在 “哪個(gè)版本?” 頁面上可以找到所實(shí)現(xiàn)的規(guī)范版本、所需的最低 Java 版本以及更多有用信息。
使用 Tomcat 10 及更高版本的用戶應(yīng)該注意,由于 Java EE 轉(zhuǎn)移至 Eclipse 基金會(huì)過程中從 Java EE 過渡到 Jakarta EE,所有已實(shí)現(xiàn) API 的主包已從 javax.更改為 jakarta.。這幾乎肯定需要更改代碼,以使應(yīng)用程序能夠從 Tomcat 9 及更早版本遷移到 Tomcat 10 及更高版本?,F(xiàn)已開發(fā)出一種遷移工具來輔助這一過程
- 現(xiàn)象:部署后訪問 Servlet 報(bào)NoClassDefFoundError: javax.servlet.http.HttpServlet。
- 原因分析:Tomcat 10 + 遵循 Jakarta EE 5.0 規(guī)范,原javax.servlet包更名為jakarta.servlet,但代碼和依賴仍使用舊包。
- 解決步驟:
替換包導(dǎo)入:
// 舊代碼(錯(cuò)誤) import javax.servlet.ServletException; // 新代碼(正確) import jakarta.servlet.ServletException;
更新 Maven 依賴:
<!-- 舊依賴(錯(cuò)誤) --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> <!-- 新依賴(正確,Tomcat 10對(duì)應(yīng)Jakarta 5.0) --> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency>
- 注意事項(xiàng):
- Tomcat 版本與 Servlet 規(guī)范嚴(yán)格對(duì)應(yīng):Tomcat 10 → Jakarta Servlet 5.0,Tomcat 11 → Jakarta Servlet 6.0。
- 避免手動(dòng)添加舊版javax.servlet-api.jar到WEB-INF/lib,Tomcat 10 + 已內(nèi)置 Jakarta 依賴。
問題 3:部署沖突,URL 模式重復(fù)映射
- 現(xiàn)象:Tomcat 啟動(dòng)時(shí)報(bào)IllegalArgumentException: 名為 [PigServlet]和 [com.fhedu.PigServlet] 的servlet不能映射為一個(gè)url模式。
- 原因分析:同時(shí)使用@WebServlet注解和web.xml配置同一個(gè) URL 路徑(/pig),導(dǎo)致 Tomcat 檢測(cè)到重復(fù)映射。
- 解決步驟:
- 僅使用注解:刪除web.xml中的 Servlet 配置:
<!-- 刪除以下內(nèi)容 --> <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配置(二選一)。
- 注意事項(xiàng):
- 注解和 XML 配置互斥,同一 Servlet 只能通過一種方式注冊(cè)。
- 檢查 IDE 部署配置,確保無殘留舊配置(如手動(dòng)添加的web.xml未刪除)。
二、關(guān)鍵知識(shí)點(diǎn)總結(jié)
- 路徑規(guī)范:
- Tomcat 和項(xiàng)目路徑必須為全英文,避免特殊字符,防止類加載和掃描失敗。
- 版本兼容性:
- Tomcat 10 + 使用 Jakarta EE 5.0+,需將javax.servlet替換為jakarta.servlet,依賴版本對(duì)應(yīng)jakarta.servlet-api:5.0.0。
- 配置統(tǒng)一性:
- 優(yōu)先使用注解(推薦)或 XML 配置,避免混合使用導(dǎo)致映射沖突。
- IDE 最佳實(shí)踐:
- 每次修改后清除緩存(File > Invalidate Caches / Restart),確保部署無殘留。
- 確認(rèn) Tomcat 配置中的Application context與訪問 URL 一致(如/demo05)。
三、預(yù)防措施與參考資料
- 預(yù)防措施:
- 新建項(xiàng)目時(shí)使用全英文路徑,避免中文 / 特殊字符。
- 初始化依賴時(shí)根據(jù) Tomcat 版本選擇對(duì)應(yīng) Jakarta Servlet 版本(Tomcat 10 → 5.0,Tomcat 11 → 6.0)。
- 統(tǒng)一配置方式,注解和 XML 不要同時(shí)使用。
- 參考資料:
四、總結(jié)
本次問題排查涉及路徑兼容性、依賴版本適配和配置統(tǒng)一性三大核心問題。通過逐步定位日志錯(cuò)誤、分析類加載沖突和配置規(guī)則,最終通過路徑修正、依賴升級(jí)和配置統(tǒng)一解決了所有問題。后續(xù)開發(fā)中需注意 Tomcat 版本特性和規(guī)范變更,避免類似問題重復(fù)發(fā)生。
到此這篇關(guān)于webservlet注解無效訪問servlet接口時(shí)報(bào)404解決辦法的文章就介紹到這了,更多相關(guān)webservlet注解無效報(bào)404內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中@ConfigurationProperties注解的使用與源碼詳解
這篇文章主要介紹了SpringBoot中@ConfigurationProperties注解的使用與源碼詳解,@ConfigurationProperties注解用于自動(dòng)配置綁定,可以將application.properties配置中的值注入到bean對(duì)象上,需要的朋友可以參考下2023-11-11Java零基礎(chǔ)教程之Windows下安裝、啟動(dòng)Tomcat服務(wù)器方法圖解(免安裝版)
這篇文章主要介紹了Windows系統(tǒng)下安裝、啟動(dòng)、注冊(cè)服務(wù)、停止 Tomcat操作的所有方法,本文通過圖文并茂的方式給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2016-09-09MyBatis中的SQL映射文件如何配置參數(shù)映射和使用方法
MyBatis 是一種開源的 Java 持久化框架,它可以自動(dòng)將數(shù)據(jù)庫中的數(shù)據(jù)映射到 Java 對(duì)象中,并且使得 Java 對(duì)象可以非常方便地存儲(chǔ)到數(shù)據(jù)庫中,本文將介紹 MyBatis 中 SQL 映射文件的參數(shù)映射配置和使用方法,需要的朋友可以參考下2023-07-07SpringBoot+websocket實(shí)現(xiàn)消息對(duì)話功能
WebSocket是一種在Web應(yīng)用程序中實(shí)現(xiàn)實(shí)時(shí)雙向通信的技術(shù),它可以用于在線游戲、在線聊天、推送通知、實(shí)時(shí)監(jiān)控等,并且比傳統(tǒng)的輪詢技術(shù)更加高效和可靠,本文就給大家介紹基于SpringBoot+websocket實(shí)現(xiàn)消息對(duì)話功能,感興趣的小伙伴可以自己動(dòng)手試一試2023-09-09SpringBoot框架內(nèi)使用Java調(diào)用訊飛星火api完整步驟
近年來人工智能技術(shù)已經(jīng)成為了各行各業(yè)中不可或缺的一部分,訊飛星火認(rèn)知是訊飛科技推出的AI開放平臺(tái),為開發(fā)者提供了豐富的人工智能技術(shù)接口和服務(wù),這篇文章主要介紹了SpringBoot框架內(nèi)使用Java調(diào)用訊飛星火api的相關(guān)資料,需要的朋友可以參考下2025-05-05