SpringBoot 404问题汇总

目录

问题现象

访问SpringBoot服务指定url时,提示404,页面找不到。

问题根源

404的错误就是服务器的资源找不到。而找不到资源可能的原因可分为两个方面

  • 资源不存在
  • 配置错误

资源不存在

此类问题表现是要访问的URL在SpringBoot服务中确实不存在。如静态资源没有添加、接口没有配置等。
此类问题只需要根据访问出现404的URL,添加相关的资源即可。
如访问/auth/login接口,那么就需要有相关的Controller配置了@RequestMapping("/auth/login")

配置错误

此类问题表现是,资源确实存在,但访问不到。如果SpringBoot程序直接运行/直接访问,此类问题的出现的概率很小。而大多数据情况下,SpringBoot不会直接为外部提供服务,而是通过nginx进行转发;同时为了部署方便及内存、端口占用等问题,往往将SpringBoot应用放到tomcat容器里运行。而这些运行方式,往往会带来一些配置上的问题。下面从转发和tomcat运行两个方面分析

消息转发配置错误

使用nginx进行转发时,路径配置错误,导致不能正常访问到SpringBoot服务的URL。
此类错误的表现是:单独运行时正常;使用nginx转发后,访问任何一个URL都提示404错误。

由于此类问题特点明显,所以比较容易定位问题,检查看nginx转发配置是否有误即可。

项目配置错误

1. RestController注解与Controller混用

RestController与Controller混合使用时,访问Controller定义的URL时,会提示404错误,具体原因暂未进行分析。

2. Controller不在Application的同级或子级

SpringBoot项目在启动时会根据Application类所在的包为依据,扫描包内及其子包下的class文件进行自动初始化、配置,如果Controller不在Applictaion包及其子包下,会导致扫描不到,不能被初始化,访问相关URL时提示404错误。

解决方法可为2种,一种是根据规则,将Controller类放到Applictaion包下或其子包下;第二种就是,告诉SpringBoot要扫描哪些包,这种方式可在Application类添加注释,@SpringBootApplication(scanBasePackages = {“xxx”, “xxxx”, “xxx”})

3. 项目中有多个SpringBootServletInitializer子类

此类问题表现是,项目按模块划分,多个模块内包含Controller。在开发调试阶段正常,单独运行每个模块也正常;使用tomcat部署后,总会随机出现一些模块的Controller访问不了的情况。
这种情况,多是因为每个模块都创建了SpringBootServletInitailizer子类

为什么不能配置多个SpringBootServletInitializer子类?
SpringBoot配置要在tomcat容器里运行,需有一个SpringBootServletInitialzer子类来启动应用。此类有一个onStartup方法,tomcat通过回调此方法来启动springboot应用,进行相关的初始化工作。
如果一个war包里包含了多个SpringBootServletInitialzer子类,这些子类都会被tomcat扫描到,然后回调每个子类的onStarup方法。先回调哪个子类是随机的,如果先回调了主模块的onStartup方法,后回调了子模块的onStartup方法,相当于本次启动只启动了子模块。这种情况下,只有最后回调的那个模块的Controller能正常访问,其他的都是404。

解决方法
只保留入口模块的SpringBootServletInitialzer子类即可。

问题排查思路

开发测试阶段

  1. 确定资源确实是存在的
  2. RestController注解与Controller注解是否混用
  3. Controller是否在Application的上一级目录

线上部署阶段

  1. 确定资源确实是存在的
  2. 随机测试几个接口,看看是否都是404。
    • 如果都是404,很可能是nginx配置错误
    • 如果部分404,且是按模块404,查看项目中是否有多个SpringBootServletInitializer子类
上一篇:vivo 全球商城:商品系统架构设计与实践


下一篇:微框架spring boot