我已经构建了一个 Spring Boot 3 应用程序,我想要一个全局异常处理程序,以便如果抛出任何异常,则会返回自定义 json 消息。我想要防止的事情之一是,如果端点具有 long 类型的路径变量并且有人提供字符串,那么我会得到以下响应:
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Failed to convert 'id' with value: 'as'",
"instance": "/api/company/as"
}
我添加了一个全局异常句柄,如下所示:
@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(Exception.class)
protected ResponseEntity<Object> handleConflict(Exception ex) {
log.error(ex.getMessage(), ex);
return ResponseEntity.ok(ResponseDto.buildUnknownErrorResponse());
}
}
但是,如果在端点调用之前抛出 spring 异常,例如 url 路径变量或 url 不存在,则它不会执行。
如何重写spring处理异常的方式?
控制器建议甚至可以在执行端点方法之前处理错误,在您的情况下,当参数无法转换时。
尝试如下更改您的 GlobalExceptionHandler 。
@ControllerAdvice
public class GlobalExceptionHandler {
private final Logger log = LoggerFactory.getLogger(GlobalErrorHandler.class);
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleError(Exception ex) {
log.error(ex.getMessage(), ex);
return ResponseEntity.ok("Unknown error message.");
}
}