编写一个自定义统一异常处理类,要求可以同时处理http请求和ajax请求两种方式产生的异常。
时间: 2023-11-22 21:55:57 浏览: 73
自定义异常的两种方式
可以通过编写一个自定义的异常处理器类来处理请求时发生的异常。以下是一个基本的实现:
```java
@RestControllerAdvice
public class CustomExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleException(HttpServletRequest request, Exception ex) {
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setTimestamp(LocalDateTime.now());
errorResponse.setMessage(ex.getMessage());
errorResponse.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
errorResponse.setError(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase());
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity<ErrorResponse> handleHttpMessageNotReadableException(HttpServletRequest request, Exception ex) {
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setTimestamp(LocalDateTime.now());
errorResponse.setMessage("Malformed JSON request");
errorResponse.setStatus(HttpStatus.BAD_REQUEST.value());
errorResponse.setError(HttpStatus.BAD_REQUEST.getReasonPhrase());
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorResponse> handleMethodArgumentNotValidException(HttpServletRequest request, MethodArgumentNotValidException ex) {
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setTimestamp(LocalDateTime.now());
errorResponse.setMessage("Validation error occurred");
errorResponse.setStatus(HttpStatus.BAD_REQUEST.value());
errorResponse.setError(HttpStatus.BAD_REQUEST.getReasonPhrase());
List<String> errors = new ArrayList<>();
for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
errors.add(fieldError.getField() + ": " + fieldError.getDefaultMessage());
}
errorResponse.setErrors(errors);
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}
// Add more exception handlers as needed
}
```
上述代码中,`@RestControllerAdvice`注释表示这是一个异常处理器类,并且在处理异常时,它将返回一个`ResponseEntity<ErrorResponse>`对象。`ErrorResponse`是一个自定义类,表示响应中的错误信息。`@ExceptionHandler`注释用于指定应该处理哪些类型的异常。在这个例子中,我们处理了通用的`Exception`异常、`HttpMessageNotReadableException`异常和`MethodArgumentNotValidException`异常。
可以通过添加更多的异常处理程序来处理其他类型的异常。此外,您可以根据需要扩展`ErrorResponse`类以包含更多有用的信息。最后,要注意,在处理`MethodArgumentNotValidException`异常时,我们会遍历所有的字段错误,然后将它们添加到`errors`列表中,以便在响应中返回所有错误。
阅读全文