SpringBoot不能请求到controller方法
今天新建一个服务,遇到一个奇怪的现象,SpringBoot能正常运行,但是不能访问到Controller类的方法里,按照常规的检查方法,一步步检查。
1.检查扫描包
启动类中需要添加@ComponentScan注解,一般只需要指定到启动类所在的包路径即可。他有两个属性:value和basePackages,作用是一样的,它们互为别名,给他们设置成某包名路径,这样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等模块。
- 本文标签: Spring Boot
- 本文链接: https://t-leader.cn/article/2
- 版权声明: 本文由站长原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权