所以您需要做的就是使用@ControllerAdvice 或@RestControllerAdvice 编写全局异常处理程序,然后编写异常处理程序。您可以将内置异常映射到异常处理程序。因此,如果出现这些异常,那么异常处理程序的代码将得到执行。并且我们可以提供自定义的错误消息,以便客户了解发生了什么问题。
下面是我为处理rest api异常而开发的代码sn-p。
所以在我的代码中,我处理了两个异常 NoSuchElementException 和 MethodArgumentNotValid 异常。
例如在我的情况下
如果您按 id 搜索记录并且如果该记录不存在,您将得到 NoSuchElementException 以便客户端知道该 id 的记录不存在
对于 MethodArgumentNotValid 异常,我为变量添加了约束
例如,尝试输入负 id 会出现此异常
@ControllerAdvice
公共类 GlobalExceptionHandler 扩展 ResponseEntityExceptionHandler{
@ExceptionHandler(NoSuchElementException.class)
public final ResponseEntity<Object>handleRecordNotFoundException(NoSuchElementException ex,WebRequest request)
{
return handleExceptionInternal(ex,ErrorResponse.builder()
.status(HttpStatus.NOT_FOUND)
.timestamp(new Date())
.detail(ex.getLocalizedMessage())
.message("Record not found")
.build(),new HttpHeaders(),HttpStatus.NOT_FOUND,request);
}
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,HttpHeaders headers,HttpStatus status,WebRequest request)
{
List<String> errors=new ArrayList<String>();
for(ObjectError error:ex.getBindingResult().getFieldErrors())
{
errors.add(error.getObjectName()+":"error.getDefaultMessage());
}
return handleExceptionInternal(ex,ErrorResponse.builder().details(errors).build,headers,HttpStatus.BAD_REQUEST,request);
}
}