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