Java EJB应用调用Controller时出现404错误,求排查思路
确认Servlet所在模块类型
你的Controller Servlet必须放在**Web模块(WAR包)**中,而非纯EJB模块(JAR包)。EJB模块不会被JBoss的Web容器扫描处理Servlet注解,只有WAR包的WEB-INF/classes目录或其内部依赖的JAR包中的Servlet才会被识别。验证Servlet注解与类的正确性
- 检查
@WebServlet注解的包路径:必须是javax.servlet.annotation.WebServlet,避免误用其他框架的同名注解。 - 确认Servlet类继承自
javax.servlet.http.HttpServlet,且doGet方法的签名完全正确:
方法权限、参数类型、抛出异常都不能出错,否则容器可能无法识别该方法。protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 你的代码 }
- 检查
查看JBoss中Servlet的实际映射
登录JBoss管理控制台(默认地址http://localhost:9990),找到已部署的OfflineInspections应用,进入Servlet标签页,检查是否存在/Controller的映射记录。如果没有,说明容器未加载该Servlet,需排查扫描或类加载问题。排查CSP过滤器缺失的影响
日志中提到的Content-Security-Policy过滤器依赖缺失,可能导致Web应用初始化时出现隐性错误(虽显示部署成功,但Web组件未完全加载):- 检查代码中是否存在
@WebFilter注解引用了不存在的CSP过滤器类; - 暂时注释掉所有与该过滤器相关的代码,重新部署后测试404问题是否消失。
- 检查代码中是否存在
确认应用上下文路径与请求路径匹配
前端请求的路径是http://localhost/OfflineInspections/Controller,需确认:- 应用部署的上下文路径确实为
/OfflineInspections(WAR包名称默认即为上下文路径,若为ROOT.war则是根路径); - 前端页面的相对路径是否正确:若页面位于
/OfflineInspections/pages/下,相对路径应改为../Controller而非Controller。
- 应用部署的上下文路径确实为
开启JBoss DEBUG日志排查加载过程
修改JBoss的standalone.xml配置,将Web容器相关日志级别调至DEBUG:<logger category="org.apache.catalina"> <level name="DEBUG"/> </logger>重新部署后,查看日志中是否有关于
ControllerServlet的加载、映射日志,或类加载失败、初始化异常等信息。检查Servlet API依赖兼容性
确保项目中Servlet API依赖版本与JBoss EAP 7.0兼容(对应Java EE 7,Servlet API 3.1),且依赖范围为provided(避免打包进WAR包导致冲突)。Maven配置示例:<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>测试极简Servlet验证基础映射
编写一个无任何业务逻辑的极简Servlet:import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/TestServlet") public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.getWriter().write("Test Success"); } }部署后直接访问
http://localhost/OfflineInspections/TestServlet:- 若仍返回404:说明Web应用的Servlet扫描机制存在全局问题;
- 若能正常访问:说明原
ControllerServlet存在初始化失败、依赖注入错误等问题,需进一步排查其内部逻辑。
内容的提问来源于stack exchange,提问作者rphello101

