网站建设公司营业范围,wordpress dota主题,深圳优化排名公司,网站建设与管理教学大纲目录
背景
前言
设计步骤
1.定义异常信息类#xff1a;
2.自定义异常#xff1a;
3.创建全局异常处理类
4.在控制器中抛出异常
5.输出
捕获 Valid 校验异常 背景 去面试的时候被问到SpringBoot项目中#xff0c;如何处理全局异常的#xff0c;也就是如何捕获全局异…目录
背景
前言
设计步骤
1.定义异常信息类
2.自定义异常
3.创建全局异常处理类
4.在控制器中抛出异常
5.输出
捕获 Valid 校验异常 背景 去面试的时候被问到SpringBoot项目中如何处理全局异常的也就是如何捕获全局异常的 前言 在Spring Boot中捕获全局异常是一种有效的方式可以将应用程序中的所有异常集中处理提供统一的错误响应并且可以避免重复编写异常处理逻辑。实现全局异常处理通常使用ControllerAdvice注解来定义一个全局的异常处理类。在类中编写异常处理方法并使用ExceptionHandler注解指定要处理的异常类型。以下是具体的步骤和示例 设计步骤
1.定义异常信息类 通常情况下我们会定义一个通用的错误信息类用来包装异常信息返回给客户端。 public class ErrorDetails {private int statusCode;private String message;private String details;public ErrorDetails(int statusCode, String message, String details) {super();this.statusCode statusCode;this.message message;this.details details;}// Getters and Setterspublic int getStatusCode() {return statusCode;}public void setStatusCode(int statusCode) {this.statusCode statusCode;}public String getMessage() {return message;}public void setMessage(String message) {this.message message;}public String getDetails() {return details;}public void setDetails(String details) {this.details details;}
}2.自定义异常 在实际项目中我们通常会自定义一些异常比如资源未找到异常。 public class ResourceNotFoundException extends RuntimeException {public ResourceNotFoundException(String message) {super(message);}
}3.创建全局异常处理类 首先我们需要创建一个带有 ControllerAdvice 注解的类这个类可以捕获应用程序中所有控制器controller抛出的异常。并使用ExceptionHandler注解指定要处理的异常类型。 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.context.request.WebRequest;ControllerAdvice
public class GlobalExceptionHandler {// 捕获特定异常ExceptionHandler(ResourceNotFoundException.class)public ResponseEntity? resourceNotFoundException(ResourceNotFoundException ex, WebRequest request) {ErrorDetails errorDetails new ErrorDetails(HttpStatus.NOT_FOUND.value(), ex.getMessage(), request.getDescription(false));return new ResponseEntity(errorDetails, HttpStatus.NOT_FOUND);}// 捕获全局异常ExceptionHandler(Exception.class)public ResponseEntity? globalExceptionHandler(Exception ex, WebRequest request) {ErrorDetails errorDetails new ErrorDetails(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage(), request.getDescription(false));return new ResponseEntity(errorDetails, HttpStatus.INTERNAL_SERVER_ERROR);}
}4.在控制器中抛出异常 在控制器中可以抛出自定义的异常然后由全局异常处理类来捕获并处理。 RestController
RequestMapping(/api)
public class ExportController {Resourceprivate UserDao userDao;GetMapping(/resource/{id})public ResponseEntityUser getResourceById(PathVariable(value id) Integer id) {User user userDao.selectById(id);//模拟找不到情况然后会抛出异常被全局异常处理器捕捉到if(user null){throw new ResourceNotFoundException(Resource not found for this id :: id);}return ResponseEntity.ok(user);}
}
5.输出 捕获 Valid 校验异常 如果你在控制器中使用 Valid 进行数据校验可以捕获校验失败时抛出的 MethodArgumentNotValidException。 import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;ControllerAdvice
public class GlobalExceptionHandler {ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity? handleValidationException(MethodArgumentNotValidException ex) {MapString, String errors new HashMap();ex.getBindingResult().getAllErrors().forEach((error) - {String fieldName ((FieldError) error).getField();String errorMessage error.getDefaultMessage();errors.put(fieldName, errorMessage);});return new ResponseEntity(errors, HttpStatus.BAD_REQUEST);}
}总结 通过 ControllerAdvice 和 ExceptionHandler我们可以在 Spring Boot 中集中管理和处理异常。全局异常处理不仅提高了代码的可维护性还为用户提供了统一且友好的错误信息。同时还可以结合日志记录、监控等功能为应用提供全面的异常管理机制。