WebSphere项目持续报Error 404: SRVE0190E错误,求排查解决
看起来你在WebSphere上部署Servlet项目时遇到了头疼的404问题,我结合你的代码和配置,给你梳理几个可能的排查方向,应该能帮你定位问题:
1. 排查Servlet注解与web.xml的冲突问题
你代码里同时用了@WebServlet("/RegisterServlet")注解,又在web.xml里配置了相同的Servlet映射,但你的web.xml用的是Servlet 2.3的DTD(web-app_2_3.dtd)——这个版本的Servlet规范根本不支持注解!也就是说,WebSphere会完全忽略你的@WebServlet注解,只认web.xml里的配置。
不过这里有个小坑:如果web.xml的版本和注解不兼容,有时候会导致映射处理混乱。建议你二选一:
- 要么保留web.xml的Servlet 2.3配置,直接删掉代码里的
@WebServlet注解; - 要么升级web.xml到Servlet 3.0+版本(WebSphere 8.0及以上支持),删掉web.xml里的servlet和servlet-mapping配置,只靠注解来映射。
升级后的web.xml模板可以参考这个:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Archetype Created Web Application</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
2. 确认访问URL是否包含项目上下文路径
这是最容易忽略的点!WebSphere部署项目时会给每个应用分配一个上下文路径(默认可能是项目名称),你访问Servlet时必须带上这个路径。
举个例子:如果你的项目部署后的上下文路径是/ussd-web,那正确的访问URL应该是:http://localhost:9080/ussd-web/RegisterServlet
如果你直接访问http://localhost:9080/RegisterServlet,肯定会报404。
你可以登录WebSphere控制台,找到你的项目,查看部署详情里的上下文路径,确认一下。
3. 检查Servlet类的包路径是否正确
你的web.xml里配置的<servlet-class>是com.web.servlet.RegisterServlet,一定要确保编译后的RegisterServlet.class文件确实在WEB-INF/classes/com/web/servlet/目录下。如果包名写错了,或者类文件放错了位置,WebSphere找不到这个Servlet,自然会返回404。
4. 查看WebSphere的后台日志找线索
前台的404提示太笼统了,WebSphere的后台日志能给你更具体的信息。你可以去WebSphere的安装目录下找profiles/<你的Profile名称>/logs/<服务器名称>/目录,查看SystemOut.log或者SystemErr.log,里面可能会有类似“Servlet类找不到”“映射配置错误”的详细异常,这能帮你快速定位问题。
5. 确认项目打包结构是否符合规范
标准的Web应用结构应该是这样的:
你的项目名/ ├── WEB-INF/ │ ├── classes/ # 存放编译后的Java类文件 │ │ └── com/ │ │ └── web/ │ │ └── servlet/ │ │ └── RegisterServlet.class │ ├── lib/ # 依赖的jar包(比如JDBC驱动) │ └── web.xml # 配置文件 └── index.jsp # 欢迎页
如果你的classes目录路径不对,或者web.xml不在WEB-INF下,都会导致部署异常,进而出现404。
你可以先按上面的步骤逐一排查,最可能的问题就是访问路径没带上下文,或者注解与web.xml版本冲突。
内容的提问来源于stack exchange,提问作者Life with George

