汇知百科
白蓝主题五 · 清爽阅读
首页  > 故障排查

MVC模式调试技巧:快速定位问题的实用方法

从请求入口开始理清流程

开发中遇到页面没数据、跳转出错,第一反应别急着翻逻辑代码。先确认请求是否正确进入Controller。比如用户点击“查看订单”,浏览器发了个GET请求到 /order/detail,这时候打开开发者工具,看Network里有没有这条请求,状态是不是200。如果没发出去,可能是前端JS绑错了事件;如果返回404,那路由配置可能有问题。

Spring MVC里可以用 @RequestMapping("/order/detail") 注解绑定路径,但拼写错误或者参数类型不匹配都会导致请求进不来。这时候加个最简单的测试接口:

@GetMapping("/test")
public String test() {
return "ok";
}

能通,说明框架没问题,问题大概率在具体实现上。

检查Model数据是否正确传递

有时候页面显示空白,后端明明查了数据。这种情况重点看Model有没有把数据塞进去。比如在Controller里写了:

@GetMapping("/list")
public String getOrderList(Model model) {
List<Order> orders = orderService.getAll();
model.addAttribute("orders", orders);
return "order/list";
}

但如果前端模板(比如Thymeleaf)写成了 ${orderList},那自然拿不到值。这时候可以在模板里先加一行调试输出:

<p th:text="${orders}"></p>

看看是不是null或者空数组。如果是,再回头查service层有没有真查到数据。

用日志打印关键节点信息

别依赖大脑记流程,该打日志就打。比如在Service层开头打印入参,在DAO层返回前打印结果集条数。简单一句:

log.debug("查询订单,用户ID:{}", userId);

能省下半小时断点调试时间。尤其线上环境不能随便打断点,日志就是唯一线索。

前端渲染问题别光看后端

有次同事说接口返回了数据,但页面就是不显示。最后发现是JSON字段名和JS里取的不一致。后端返回的是 create_time,前端却写成 createTime。JavaScript区分大小写,直接报undefined。这种问题在前后端联调时特别常见。

建议统一约定命名风格,要么全用下划线,要么全用驼峰。实在不行,在Controller层做一次字段映射转换。

善用断点与条件断点

IDE里的断点不是只能打一行。比如某个订单在特定用户下才出问题,可以设条件断点:只在 userId == 10086 时暂停。避免每次都要手动跳过无关请求。

另外,异常抛出时记得开启“Break on Exception”,尤其是NullPointerException。很多时候程序没按预期走,就是因为某个对象是null,但被静默处理了。

静态资源加载失败也会影响MVC流程

虽然CSS、JS不属于MVC三要素,但它们加载失败会导致页面交互异常,误判为Controller逻辑问题。比如提交表单没反应,查了半天Controller,结果是jQuery没加载成功。打开Network看有没有404的js文件,路径配错了就得去配置ResourceHandler。

Spring Boot里检查 webjars 或 static 目录下的文件是否存在,别让小问题拖住大进度。