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
相关产品推荐
相关产品推荐

