Spring 4.X注解REST API:NoHandlerFoundException返回非JSON格式需何配置?
解决Spring 4.X中NoHandlerFoundException无法返回JSON的问题
嘿,这个问题我之前踩过坑!在Spring 4.X里要让NoHandlerFoundException返回JSON格式响应,除了你已经设置的servlet.setThrowExceptionIfNoHandlerFound(true),还需要在Servlet配置里做两个关键调整:
1. 禁用Servlet容器的默认错误页面转发
默认情况下,当NoHandlerFoundException抛出时,Servlet容器会自动尝试转发到默认的错误页面(比如/error),这会直接绕过Spring的全局异常处理器,导致返回的是HTML错误页面而非JSON。
如果你是用注解方式配置DispatcherServlet(比如继承AbstractAnnotationConfigDispatcherServletInitializer),需要在customizeRegistration方法中添加以下配置:
@Override protected void customizeRegistration(Dynamic registration) { // 你已设置的参数:开启抛出NoHandlerFoundException registration.setInitParameter("throwExceptionIfNoHandlerFound", "true"); // 禁用容器默认的错误页面转发,让Spring接管异常处理 registration.setErrorPage(null); // 可选:如果你的API需要处理OPTIONS请求,加上这个参数 registration.setInitParameter("dispatchOptionsRequest", "true"); }
2. 确保全局异常处理器正确返回JSON
光有Servlet配置还不够,你的GlobalExceptionHandler需要明确返回JSON格式的响应:
- 给处理
NoHandlerFoundException的方法添加@ResponseBody注解,或者直接返回ResponseEntity对象(Spring会自动完成JSON序列化) - 确保项目中已经引入了Jackson依赖(比如
jackson-databind),这是Spring将POJO转为JSON的核心依赖
示例代码参考:
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(NoHandlerFoundException.class) @ResponseBody public ResponseEntity<ErrorResponse> handleNoHandlerFound(NoHandlerFoundException ex) { ErrorResponse error = new ErrorResponse(); error.setStatus(HttpStatus.NOT_FOUND.value()); error.setMessage("请求的资源不存在"); error.setPath(ex.getRequestURL()); return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); } // 自定义错误响应POJO,用于封装JSON格式的错误信息 static class ErrorResponse { private int status; private String message; private String path; // 省略getter和setter方法 } }
这样配置后,当触发NoHandlerFoundException时,Spring的全局异常处理器就能捕获它,并返回标准的JSON格式错误响应了。
内容的提问来源于stack exchange,提问作者Lokendra Sharma
相关产品推荐
相关产品推荐

