Spring Boot控制器断点未触发但Service可触发的问题排查
结合你的代码、配置和现象,我整理了几个最可能的原因:
Controller未被Spring容器识别并管理
你的MyController类缺少关键的类级别注解!Spring MVC需要通过@RestController(或者@Controller)来标记一个类为控制器Bean,否则Spring不会把它注册到容器中,自然也不会将请求路由到这个类的方法里。你只给方法加了@GetMapping,但类上没加控制器注解——这就解释了为什么Controller的断点完全没触发,而Service的断点能触发(可能是被其他地方的调用触发的)。请求路径被Vaadin框架接管或匹配错误
你的项目引入了vaadin-spring-boot-starter依赖,Vaadin框架有自己的路由机制,可能会和你Spring MVC的@GetMapping("/{id}")路径产生冲突。比如Vaadin可能接管了根路径的请求,导致你浏览器发送的HTTP请求根本没被Spring MVC的DispatcherServlet处理,而是直接进入Vaadin的处理流程。另外也请确认你发送请求的URL是否完全匹配/{id}的格式,比如有没有遗漏项目上下文路径,或者路径拼写错误。Debug启动时的多进程导致断点失效
启动debug时出现两个终端,大概率是因为Spring Boot Maven插件的默认行为:spring-boot:run目标默认会fork一个新进程来运行应用,如果你同时又通过IDE直接启动了应用的main类,就会出现两个独立的应用进程。这种情况下,你可能在其中一个进程里设置了断点,但实际请求是跑到另一个进程里了,所以Controller的断点没触发。建议检查IDE的启动配置,确保只通过一种方式启动debug(要么用Maven插件,要么直接运行main类,不要同时启动)。IDE断点配置异常
虽然这个可能性比较低,但也可以快速排查:比如是不是给Controller的断点设置了不满足的条件,或者断点被意外禁用了?你可以尝试删除断点重新添加,或者在Controller方法里加一行System.out.println("请求进入MyController的getById方法"),运行后看控制台有没有输出,以此确认请求是否真的走到了这个方法里。
内容的提问来源于stack exchange,提问作者user1474111

