springboot访问请求404的原因及解决办法

在使用Spring Boot开发应用程序时,有时可能会遇到访问请求出现404错误的情况,即请求的资源未找到,这篇文章主要给大家介绍了关于springboot访问请求404的原因及解决办法,需要的朋友可以参考下

可能出现的原因

1.你请求的URL路径不对,比如说你请求的路径是/usr/list,GET方法,但是你UserController上面的RequestMapping是这个样子:@RequestMapping(“user”),有可能哈

2.前端的请求时GET方法,后端对应的处理函数的方法是非GET方法

3.Controller和RestController注解混用了,两个中删除一个试试

4.访问的是静态资源,那么查看是否配置好了静态资源,就是把静态资源放到Resources下面的static文件夹中,也可以通过配置类来自定义存放路径

下面是通过配置类的方式,来配置静态资源存放的路径

我的静态资源是直接放在Resources下面的,新建一个类,类名随意

继承WebMvcConfigurationSupport重写addResourceHandlers方法
在类

@Configuration
@Slf4j
public class WebMvcConfig extends WebMvcConfigurationSupport {
    /**
     * 配置静态资源映射
     *
     * @param registry
     **/
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        log.info("开始进行静态资源映射");
        //将路径中包含backend的请求映射到backend文件夹下
//这句话的意思是,只要请求的是/backend下面的文件都映射到Resources下面的backend文件夹下面,classpath:
        registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
//上同        
        registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
    }
    }

上面加上@Configuration注解

5.你的Controller类没有被扫描到,这种情况一般是启动类在一个包里面

 

解决办法:

1、把你的启动类从包里面拿出来,放到外面,如图所示

 

2、用和MapperScan和scanBasePackages来指明需要扫描的包

如图所示

 

3、项目中有多个SpringBootServletInitializer子类

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

这种情况,多是因为每个模块都创建了SpringBootServletInitailizer子类。

解决办法就是只保留入口模块的SpringBootServletInitialzer子类即可

补充:

若是线上部署阶段排错思路

1.确定资源确实是存在的

2.随机测试几个接口,看看是否都是404。

  • 如果都是404,很可能是nginx配置错误
  • 如果部分404,且是按模块404,查看项目中是否有多个SpringBootServletInitializer子类

总结 

到此这篇关于springboot访问请求404的原因及解决办法的文章就介绍到这了

### 创建或配置位于默认包中的Spring Boot应用程序 当创建一个Spring Boot应用程序时,默认情况下,`@SpringBootApplication`注解会启用组件扫描功能。如果该注解所在的类不在任何特定的包下(即位于默认包),则可能会引发一些潜在的问题。 #### 默认包的影响 Spring Boot依赖于其内部机制来自动检测和加载组件。通常,`@SpringBootApplication`会被放置在一个根包路径上,以便能够扫描到子包下的所有组件。然而,如果应用被放在默认包中,则不会有任何包结构可供扫描[^1]。这可能导致以下问题: - **实体未被识别**:JPA或其他ORM框架可能无法找到数据访问层的相关实体。 - **控制器缺失**:RESTful API或者Web MVC相关的Controller类可能不被注册为Bean。 因此,在实际开发过程中,建议始终将主程序类置于某个具体的命名空间之下,而不是留在默认包里。 #### 解决方案一:显式设置基础包名 可以通过修改@SpringBootApplication注解的行为来解决这个问题。具体做法是在此注解之上增加@ComponentScan参数,手动指定要扫描的基础包名称: ```java @SpringBootApplication(scanBasePackages = {"org.example"}) public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` 这样即使MyApplication处于无父目录的状态下也能正常工作因为已经明确了需要查找哪些位置内的bean定义信息[^2]. #### 解决方案二: 移动至非默认包 最简单也是推荐的方式就是把整个项目结构调整好使得入口point归属于某一层级分明清晰可见的位置比如com.mycompany.applications之类的命名约定形式下面去构建整个工程架构体系从而避免上述提到的各种麻烦事发生同时还能获得更好的可维护性和扩展性优势等等好处多多哦朋友们快来试试看吧😊 另外关于重试机制方面可以参阅之前给出的例子通过@EnableRetry以及相应的方法级别声明即可轻松达成目标无需额外编写复杂逻辑代码片段如下所示展示了基本用法场景之一供参考学习之用 : ```java @Service public class SomeService { @Retryable(value = {SomeException.class}, maxAttempts = 3, backoff = @Backoff(delay = 500)) public String someMethod() throws SomeException{ //业务处理部分省略... throw new SomeException(); } @Recover public String recover(SomeException ex){ return "Fallback response"; } } ``` 最后提醒一下大家记得查看官方文档获取更多细节说明链接已附于此供大家查阅方便快捷高效实用性强值得收藏备用哟😉
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值