zoukankan      html  css  js  c++  java
  • Spring boot 子模块不同包名下controller接口404问题解决方案

    项目背景,在做项目时使用了一套别人的Spring boot三方开源系统当基础框架,然后在此系统基础上增加子模块,书写新的controller接口和业务逻辑。项目结构如下图:

    system是@SpringBootApplication标注类所在的主工程模块,statistics是我建立的子模块,我在该子模块下建立了controller接口,也进行了注解,但是启动后访问该接口,提示404错误找不到该接口。


     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    经过排查解决过程如下:

    1、@SpringBootApplication标注类一定要增加@ComponentScan标注,标识主模块包名+子模块包名

    2、务必在主模块pom.xml中依赖子模块,网上很多教程根本没说这一步,只说使用@ComponentScan标注,只使用@ComponentScan标注,亲测无效!

     

     3、@ComponentScan标注了,主模块pom.xml把子模块也导入后,务必刷新maven依赖,否则还是不会生效,不要以为直接run就可以了,我就是被这里坑了一下午,点击Reload project

     4、这时可以运行了,各位可以看到,一个完全不同包名的子模块下的controller接口,在swagger中显示出来了,打完收工!

     

    5、原理性的东西补充一下,Spring Boot在进行组件扫描时

    5.1 如果你的其他包层次结构位于使用@SpringBootApplication标注主应用程序下方,则隐式组件扫描将自动涵盖。也就是说,不要明确标注@ComponentScan,Spring Boot会自动搜索当前应用主入口目录及其下方子目录。
    5.2 如果其他包中的bean /组件不在当前主包路径下面,,则应手动使用@ComponentScan 添加,指定需要扫描的路径,他就会完全按你指定的路径进行扫描,所以你必须指定主工程、子模块所有的包名
    5.3 如果使用了@ComponentScan ,那么Spring Boot就全部依赖你的定义,如果定义出错,会出现autowired时出错,报a bean of type that could not be found错误,让你很恼火哦。

  • 相关阅读:
    java使用Websocket获取HttpSession出现的问题与解决
    java 静态导入 小结
    【编程思想笔记】内部类的初始化
    【搬运】Tea算法Java实现工具类
    OBS studio最新版配置鉴权推流
    debian 9 双显卡安装NVIDIA显卡驱动
    【学习笔记】Java finalize()的使用
    【学习笔记】js下拉刷新、上拉加载 mescroll框架的使用
    [随笔] 简单操作解决Google chrome颜色显示不正常的情况
    【自制工具类】struts返回json数据包装格式类
  • 原文地址:https://www.cnblogs.com/Rocky_/p/15589514.html
Copyright © 2011-2022 走看看