JBoss7部署Spring Boot(Undertow)项目出现404错误求助
看起来你碰到了Spring Boot部署到外部容器(JBoss)的典型坑——嵌入式Tomcat跑起来一切正常,JBoss部署后却出现404,我来帮你一步步排查解决:
1. 先确认启动类是否继承了SpringBootServletInitializer
这是部署到外部Servlet容器的核心要求,嵌入式Tomcat不需要这个,但JBoss这类外部容器必须靠它来初始化Spring应用上下文。你的启动类应该改成这样:
@SpringBootApplication public class YourAppApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(YourAppApplication.class); } public static void main(String[] args) { SpringApplication.run(YourAppApplication.class, args); } }
如果没加这个类或者没重写configure方法,JBoss根本没法正确加载你的Spring应用,自然会返回404。
2. 检查JBoss的上下文路径是否正确
你用*-war.original部署时,JBoss默认的上下文路径是这个文件的名字去掉后缀。比如你的文件是myapp-war.original,那么访问路径要加上/myapp-war前缀——比如原来嵌入式Tomcat里的/api/hello,现在要写成http://your-jboss-host:port/myapp-war/api/hello。
如果你想自定义上下文路径,可以在pom.xml里设置<finalName>:
<build> <finalName>my-app</finalName> <!-- 其他插件配置 --> </build>
这样生成的my-app-war.original部署后,上下文路径就是/my-app,访问起来更友好。
3. 验证Spring Boot Maven插件配置是否正确
Spring Boot的war插件默认会生成两个文件:一个是带嵌入式Tomcat的可执行war,另一个*-war.original是供外部容器使用的纯war包。确保你的插件配置没有问题:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <attach>true</attach> <!-- 确保生成original文件 --> </configuration> </plugin>
如果插件配置有误,可能导致*-war.original的结构不正确,JBoss无法正确解析。
4. 查看JBoss日志,确认应用是否完全启动
部署成功的提示不代表Spring容器已经初始化完成。去JBoss的server.log里搜索类似Started YourAppApplication in X seconds的日志——如果找不到这条日志,说明应用没真正启动,大概率是依赖冲突。
最常见的是Servlet API冲突:Spring Boot依赖里的Servlet API必须设置为provided,因为JBoss已经自带了这个库,避免重复加载:
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> </dependency>
5. 检查Controller的RequestMapping路径
最后确认下你的Controller注解有没有拼写错误,比如@RequestMapping("/api")有没有写成@RequestMapping("api")(少了斜杠),或者有没有使用相对路径导致的问题。另外,确保Controller类上加上了@RestController或@Controller注解,否则Spring不会把它识别为请求处理类。
按照上面的步骤排查,应该能解决你的404问题。
内容的提问来源于stack exchange,提问作者edwin

