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

Spring Controller无方法映射时如何自定义抛出错误信息?

Spring Controller自定义不存在接口的错误响应

在Spring Boot项目中,要替换不存在接口时的默认错误返回,有两种常用的实现方式,以下是具体步骤:

方法一:全局异常处理器捕获NoHandlerFoundException

首先需要修改配置,让Spring在找不到请求处理器时抛出异常,在application.properties中添加:

# 开启找不到处理器时抛出异常
spring.mvc.throw-exception-if-no-handler-found=true
# 关闭静态资源映射,避免请求被静态资源处理器拦截
spring.web.resources.add-mappings=false

然后编写全局异常处理类,捕获该异常并返回自定义响应:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.NoHandlerFoundException;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(NoHandlerFoundException.class)
    public ResponseEntity<Map<String, Object>> handleNoHandlerFound(NoHandlerFoundException ex) {
        Map<String, Object> response = new HashMap<>();
        String requestPath = ex.getRequestURL();
        response.put("message", requestPath + " 不存在");
        response.put("status", HttpStatus.NOT_FOUND.value());
        response.put("timestamp", LocalDateTime.now().toString());
        return new ResponseEntity<>(response, HttpStatus.NOT_FOUND);
    }
}

此时请求不存在的接口(如GET /api/v1/foos),会返回如下格式的响应:

{
    "message": "/api/v1/foos 不存在",
    "status": 404,
    "timestamp": "2024-02-29T21:30:00"
}

注意:这里将状态码改为404更符合HTTP规范,原示例返回500属于错误的状态码使用,接口不存在属于客户端错误,应返回404。

方法二:自定义ErrorController

如果不想依赖异常抛出,可以直接自定义ErrorController接管所有错误请求,包括不存在的接口:

import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

@RestController
public class CustomErrorController implements ErrorController {

    @RequestMapping("/error")
    public ResponseEntity<Map<String, Object>> handleError(HttpServletRequest request) {
        Map<String, Object> response = new HashMap<>();
        String requestPath = request.getRequestURI();
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        
        response.put("message", requestPath + " 不存在");
        response.put("status", statusCode != null ? statusCode : HttpStatus.NOT_FOUND.value());
        response.put("timestamp", LocalDateTime.now().toString());
        
        HttpStatus httpStatus = statusCode != null ? HttpStatus.valueOf(statusCode) : HttpStatus.NOT_FOUND;
        return new ResponseEntity<>(response, httpStatus);
    }
}

这种方式无需额外配置,Spring Boot会自动使用自定义的ErrorController处理错误请求,涵盖接口不存在的场景。

额外说明

  • 如果项目需要处理其他类型的错误,可以在全局异常处理器或自定义ErrorController中扩展对应的逻辑。
  • 两种方式都可以根据需求调整响应的字段内容,比如添加更多自定义信息。

内容的提问来源于stack exchange,提问作者user352290

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 23:30:26