• 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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

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

    
    
    
    
        org.springframework.boot
    
        spring-boot-starter-tomcat
    
        provided
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

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

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

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

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    【构建工具】PostCSS快速配置
    java项目技术方案——书写示例
    闲聊互联网经济的现代化
    20天零基础自学Python | Day9 List列表用法大全
    Matlab/simulink基于MPPT风光储微电网建模仿真(持续更新)
    屏幕录像软件camtasia2022汉化版好用的录屏软件
    Excel_字母数字混合排序(数字不符合预期)的一种解决方法
    【Javascript】运算符(赋值,算术,自增,自减)
    keil5打开keil4工程无法编译的情况解决办法!!!!!!
    GitHub发布安全漏洞“死对头”CodeQL,“解放”程序员双手
  • 原文地址:https://blog.csdn.net/bhegi_seg/article/details/126114107