You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:26:22