Spring Boot 2.0部署WebSphere 9后Controller路径返回404求助
你遇到的这个情况挺典型的——嵌入式Tomcat跑的好好的,打包成WAR丢到WebSphere 9就出Controller 404,首页却能访问,大概率是容器适配和类加载的问题,给你梳理几个关键配置点:
1. 修正Spring Boot的Tomcat依赖范围
WebSphere本身自带Servlet容器,你必须把Spring Boot自带的Tomcat依赖标记为provided,避免和WebSphere的容器API冲突。在你的build.gradle里调整依赖:
dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' // 把Tomcat依赖设为providedRuntime,打包时不包含进WAR providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' // 你的其他依赖(比如mybatis的mapper扫描相关)... }
如果不这么做,WAR包会自带Tomcat的servlet相关jar,和WebSphere自带的容器类冲突,导致Spring MVC的请求映射无法被正确识别。
2. 修改WebSphere的类加载策略
WebSphere默认是父类优先的类加载顺序,但Spring Boot应用需要子类优先(也就是应用自己的类先加载),否则WebSphere自带的旧版本Servlet或Spring类会抢先加载,和你的Spring Boot 2.0版本不兼容。
操作步骤:
- 登录WebSphere管理控制台
- 找到你部署的应用,进入「类加载和更新检测」页面
- 把类加载顺序改成「类加载器的类先加载,然后是父类加载器」(英文是"Classes loaded with local class loader first (parent last)")
- 保存后重启应用
3. 确认上下文根配置
注意Spring Boot的server.servlet.context-path配置在外部容器部署时会失效,WebSphere控制台设置的上下文根才是生效的。比如你在WebSphere里把应用上下文根设为/myapp,那访问Controller的路径应该是/myapp/path/mapped/in/controller,而不是直接用/path/mapped/in/controller——很多人会在这里踩坑。
4. 验证SpringBootServletInitializer配置
你的MyApplication类已经正确继承了SpringBootServletInitializer并重写了configure方法,这部分没问题,但要确认没有其他自定义的DispatcherServlet配置。如果手动注册了DispatcherServlet,会和Spring Boot自动配置的冲突,导致请求映射失效。
先试试前两个配置,这是解决这类问题最常见的方案,大概率能解决你的404问题。
内容的提问来源于stack exchange,提问作者osama yaccoub

