spring boot正常启动之后访问controller下接口报404的解决方案

背景

创建了一个sprting boot项目反复确认过依赖没有问题,但是始终报404, 解压打包好的jar包文件发现代码已经打包进去了,现象比较奇怪.

各种原因及解决方案


原因一、controller`没有被spring 容器扫描到

  • 如果启动失败,一直报错,是有可能 你的启动类直接放在了 src.java.main 下面 ,这是错误的,你需要将您的启动类放在 src.java.main.*以下 例如 src.java.main.com.example 下面

  • 如果启动成功,但是却访问不了你自己写的controller,报404错误,那么原因就是您写的controller没有被spring 容器扫描到

    • spring boot 默认扫描您的类是 在启动类的当前包 和 下级包 。比如: 您的启动类(TestStart.java)在 com.example.test 下(com.example.test.TestStart.java) 那么spring 会扫描 com.example.test
      com.example.test.* 如果你的controller(TestController.java)没有放在com.example.test或者com.example.test.*下的话,就不会被扫描到,就会发生404错误.
    • 另外还可通过 配置spring扫描路径来解决问题
      在启动类的上面添加 @ComponentScan(basePackages = {"com.example.*"}),这配置的controller所在的包,重新编译运行后成功调用controller下的接口

原文参考: spring boot无法启动,或者正常启动之后无法访问报404的解决办法

原因二、 controller中@Controller注解后面需要添加@ResponseBody注解

在controller中@Controller注解后面或者在需要返回数据的方法前面添加@ResponseBody注解, 另外还可以直接用@RestController替换这两个注解, @RestController
@RestController 注解相当于@ResponseBody + @Controller合在一起的作用, 需要注意的是

  1. 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。

  2. 如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
    如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

  3. 如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解

原文参考: @Controller和@RestController的区别?

原因三、 需要重写configure

重写configure,可以不用新建类直接在Application里面写

接着是新建一个ServletInitializer 并且集成自SpringBootServletInitializer 示例代码如下:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    // 不重写打包war部署到tomcat接口会报404
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
}

特别注意其中的Application要与我们自己建立的Application名称一样。

如果要放在其他tomcat上的话要在pom.xml需要加入下面的依赖:

<!-- 打war包时加入此项, 告诉spring-boot tomcat相关jar包用外部的,不要打进去 -->

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-tomcat</artifactId>

    <scope>provided</scope><!--由JDK或者容器提供-->

</dependency>

至于为什么要继承重写目前找到的说法如下:(具体还是要自己了解一下SpringBootServletInitializer

这里继承SpringBootServletInitializer 并重写其中的configure方法目的是使用Spring框架的Servlet3.0支持。并且允许我们可以配置项目从serclet容器中启动。

SpringBootServletInitializer的执行过程,简单来说就是通过SpringApplicationBuilder构建并封装SpringApplication对象,并最终调用SpringApplicationrun方法的过程

原文参考: springboot打包war部署到tomcat接口404

  • 28
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
接口404错误通常有几个可能的原因。首先,可能是因为端口号后面的访问路径书写错误,导致请求无法进入到后端接口里。解决方案是仔细排查访问接口的地址是否正确,包括项目访问路径、类上的@RequestMapping配置的value地址值等。\[1\] 另外,如果端口号后面的访问路径书写正确,但在返回到前端页面时404异常,可能是因为没有书写相应的前端页面。在Spring Boot中,默认情况下,返回的结果会经过视图解析器解析并匹配一个合适的前端页面进行展示。如果没有相应的前端页面,就会404异常。解决方案是添加@ResponseBody注解到controller类的方法上或者类上,并确保方法的返回值能够在项目中找到对应的前端页面。\[2\] 此外,还有可能是由于项目访问路径或类上的@RequestMapping注解的值漏写或名称写错导致接口404错误。解决方案是仔细检查server.servlet.context-path(项目访问路径)和类上的@RequestMapping注解的值是否正确。\[3\] #### 引用[.reference_title] - *1* *2* *3* [关于访问后端接口404的问题——全网最详细的404错误详解](https://blog.csdn.net/CNCDXX_88/article/details/129489299)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值