原创

SpringBoot不能请求到controller方法

温馨提示:
本文最后更新于 2025年01月08日,已超过 442 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

今天新建一个服务,遇到一个奇怪的现象,SpringBoot能正常运行,但是不能访问到Controller类的方法里,按照常规的检查方法,一步步检查。

1.检查扫描包

启动类中需要添加@ComponentScan注解,一般只需要指定到启动类所在的包路径即可。他有两个属性:valuebasePackages,作用是一样的,它们互为别名,给他们设置成某包名路径,这样Spring项目启动时就会加载该包和其子包的带有特定注解的类到Spring容器中。通俗点理解就是,把带了帽子的对象集中管理。而这些注解有@Component@Bean@Controller@Service@Repository等。

  • 只写一个包路径时,可以这样写
@ComponentScan(basePackages = "com.tleader")
@ComponentScan(value = "com.tleader")
  • 需要写多个包路径时,可以这样写,使用花括号:
    @ComponentScan(value = {"com.tleader","com.tleader.controller"})
    @ComponentScan(scanBasePackages  = {"com.tleader","com.tleader.controller"})
    

    2.检查配置文件

    server:
      port: 8600
      servlet:
        context-path: /xxx
    

3.检查Controller类

Controller类需要使用@Controller@RestController注解(@RestController是@Controller@ResponseBody的组合);
方法上需要使用请求映射的注解,如:@GetMapping@PostMapping等。

4.检查pom.xml依赖

必须加入以下依赖,都这Controller将无法工作

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

SpringBoot版本检查

做完以上检查后,重启程序,仍然访问不到controller方法里,并不是说以上的检查有误,那都是很基础很常规的,不用质疑。于是将思路转移到SpringBoot的版本上,我的程序里使用了SpringBoot2.7.2,会不会跟某些依赖不兼容,于是改为使用SpringBoot2.4.3。重启程序后,正常访问到Controller方法里了

  • 那为什么使用SpringBoot2.7.2不能访问到Controller方法里呢?

    • WebMvc 的默认配置:在 Spring Boot 2.7.2 中,spring.mvc.pathmatch.matching-strategy默认值从ANT_PATH_MATCHER改为了PATH_PATTERN_PARSER。这可能会影响到路径匹配的规则,尤其是复杂路径的匹配。
      如果你的Controller方法路径包含一些特殊字符或复杂的路径表达式,可能会受到影响。例如,@GetMapping("/user/{id:[0-9]+}")这种带有正则表达式的路径匹配。
      可以在application.yml文件中显式指定使用ANT_PATH_MATCHER策略:

      spring:
      mvc:
      pathmatch:
       matching-strategy=ANT_PATH_MATCHER:
      

      加上这个配置之后,可以正常访问到Controller方法里。

    • 与Spring Framework 版本不兼容:Spring Boot 2.7.2 依赖特定版本的 Spring Framework。虽然 Spring Boot 会自动管理依赖版本,但如果手动引入了与 Spring Boot 不兼容的 Spring Framework 版本,可能导致问题。例如,手动引入了过新或过旧的spring-context、spring-webmvc等模块。

正文到此结束
本文目录