如何在Spring与MyBatis中显示SQL错误信息?
看起来你遇到的问题是MyBatis执行SQL时抛出了异常,但请求直接静默退出,连错误信息都没打出来——这确实挺让人头疼的,尤其是已经加了--debug参数还是没结果。结合你用的Spring Boot + MyBatis版本,我给你几个具体的排查方案:
一、调整日志级别,强制输出MyBatis的执行细节
你现在的日志只打到了INFO级别,MyBatis的SQL执行和异常信息默认不会在这个级别输出。你需要在application.properties(或application.yml)里添加这几个配置:
# 替换为你实际的Mapper接口所在包路径,打印SQL执行及参数 logging.level.com.yourpackage.shorturl.mapper=DEBUG # 打印MyBatis底层执行细节,包括完整异常栈 logging.level.org.mybatis=TRACE # 可选:打印Spring JDBC连接与错误处理细节 logging.level.org.springframework.jdbc=DEBUG
配置后,不管异常被哪里吞了,MyBatis底层的日志都会把错误信息完整输出。
二、手动捕获异常,打印完整栈信息
有时候Spring的异常处理器或框架封装会把异常吞掉,这时候最直接的办法是在代码块外层加try-catch,强制打印异常栈:
try { System.out.println("sourceMapper = " + sourceMapper); Source source = sourceMapper.findByHost(host); System.out.println("source = " + source); } catch (Exception e) { // 推荐用日志框架打印,能整合到系统日志体系中 log.error("根据Host查询Source失败,Host值为: {}", host, e); // 临时调试也可以直接打控制台 e.printStackTrace(); // 若需要上层处理异常,记得重新抛出:throw e; }
注意一定要把异常对象e作为日志方法的第三个参数传入,这样才会打印完整的异常栈轨迹,而不是只输出一句错误描述。
三、检查全局异常处理器是否吞了异常
如果你的项目里有@ControllerAdvice标注的全局异常处理类,检查是不是处理逻辑只返回了错误响应,但没有打印日志。比如这类代码就会导致异常“静默消失”:
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) @ResponseBody public Result handleException(Exception e) { // 只返回错误结果,未记录日志 return Result.fail("系统错误"); } }
这种情况需要在方法里添加日志输出:log.error("全局捕获未处理异常", e);。
四、确认MyBatis的日志实现配置正确
有时候MyBatis的日志实现未适配Spring Boot的日志框架,也会导致日志输出失败。你可以在mybatis-config.xml里明确指定日志实现:
<configuration> <settings> <setting name="logImpl" value="SLF4J"/> </settings> </configuration>
如果没有单独的mybatis-config.xml,也可以在application.properties中配置:
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
从你提供的日志来看,Spring已经加载了SQL错误码配置,但因为异常被吞掉,所以没打印具体错误。按照上面的方法调整后,应该就能看到完整的异常栈和SQL执行细节了。
内容的提问来源于stack exchange,提问作者Chloe

