Spring Framework中心跳服务的正确实现及404问题排查
问题根源
你代码里的ServerResponse是Spring WebFlux(响应式Web框架)的组件,但你使用的是基于@Controller的Spring MVC(传统Servlet栈),两者编程模型不兼容,Spring MVC无法识别ServerResponse类型的返回值,导致接口无法被正确映射,出现404错误。
正确实现方式
以下两种Spring MVC原生的实现方式,都可以实现仅返回200状态码的心跳接口:
方式一:使用ResponseEntity<Void>
这种方式可以明确控制响应状态码和响应体(指定Void表示无响应体):
import org.springframework.http.ResponseEntity; // 其他import保持不变 @CrossOrigin(origins = "*") @Controller @RequestMapping(path = "/status") public class StatusController { private static final Logger logger = LoggerFactory.getLogger(StatusController.class); @CrossOrigin(origins = "*") @GetMapping(path = "/heartbeat") public ResponseEntity<Void> getHeartbeat() { logger.info("checking heartbeat"); return ResponseEntity.ok().build(); } // hello方法保持不变 }
方式二:使用@ResponseStatus注解
如果不需要精细控制响应体,仅需返回200状态码,这种方式更简洁:
import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; // 其他import保持不变 @CrossOrigin(origins = "*") @Controller @RequestMapping(path = "/status") public class StatusController { private static final Logger logger = LoggerFactory.getLogger(StatusController.class); @CrossOrigin(origins = "*") @GetMapping(path = "/heartbeat") @ResponseStatus(HttpStatus.OK) public void getHeartbeat() { logger.info("checking heartbeat"); } // hello方法保持不变 }
额外说明
- 两种方式部署后,调用
mysite.com/myapp/status/heartbeat都会返回200状态码且无响应体,符合心跳检测的需求。 - 从
hello接口正常工作来看,当前环境是Spring MVC,无需调整依赖。
内容的提问来源于stack exchange,提问作者pbuchheit
相关产品推荐
相关产品推荐

