springboot-ControllerAdvice全局捕获异常

本文介绍了一个使用SpringBoot实现的全局异常处理机制。通过@ControllerAdvice注解定义了一个全局的异常处理类GlobalExceptionHandler,并使用@ExceptionHandler注解来指定该方法用于处理RuntimeException类型的异常。异常被捕获后,会返回一个包含错误码和错误信息的JSON格式响应。
//开启全局捕获异常
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(RuntimeException.class)//拦截所有运行时异常
    @ResponseBody //ResponseBody返回json。
    // 如果是跳转到错误页面就直接写页面地址,返回String跳转到页面。
    public Map<String ,Object> errorMap(){
        Map<String,Object> result=new HashMap<String ,Object>();
        result.put("errorCode","500");
        result.put("errorMsg","系统异常");
        return result;
    }

}

 

### 如何在Spring Boot项目中正确捕获和处理Hibernate Validator抛出的异常 #### 使用全局异常处理器 为了更好地管理应用程序中的错误响应,在Spring Boot应用里推荐使用`@ControllerAdvice`来定义一个全局异常处理器。这允许集中化异常处理逻辑,而不是分散到各个控制器方法内。 ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<Object> handleValidationExceptions(MethodArgumentNotValidException ex) { List<String> errors = new ArrayList<>(); for (FieldError error : ex.getBindingResult().getFieldErrors()) { errors.add(error.getField() + ": " + error.getDefaultMessage()); } Map<String, Object> response = new HashMap<>(); response.put("timestamp", LocalDateTime.now()); response.put("status", HttpStatus.BAD_REQUEST.value()); response.put("errors", errors); return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); } } ``` 此代码片段展示了如何捕捉来自数据验证失败引发的`MethodArgumentNotValidException`并返回结构化的JSON格式错误消息给客户端[^5]。 #### 自定义约束违反异常处理器 除了上述方式外还可以通过自定义的方式去处理特定场景下的校验异常: ```java @RestControllerAdvice class ConstraintViolationExceptionHandler extends ResponseEntityExceptionHandler { @Override protected ResponseEntity<Object> handleConstraintViolation( ConstraintViolationException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) { List<String> details = new ArrayList<>(); for (ConstraintViolation<?> violation : ex.getConstraintViolations()) { details.add(violation.getRootBeanClass().getName() + "." + violation.getPropertyPath() + ": " + violation.getMessage()); } ApiValidationError apiError = new ApiValidationError(HttpStatus.BAD_REQUEST, "Validation Failed", details.toArray(new String[details.size()])); return handleExceptionInternal(ex, apiError, new HttpHeaders(), HttpStatus.BAD_REQUEST, request); } } ``` 这段代码实现了对`ConstraintViolationException`类型的特殊处理机制,它会遍历所有的违规项并将它们转换成易于理解的信息列表形式发送回前端用户[^2]。 #### 结合AOP切面编程技术优化日志记录 对于生产环境而言良好的日志记录也是不可或缺的一部分。可以考虑引入面向方面程序设计(AOP),当发生任何未预期的情况时自动触发相应的操作比如写入文件或者通知相关人员等动作。 ```java @Aspect @Component @Slf4j public class ValidationLoggingAspect { @AfterThrowing(pointcut="execution(* *(..)) && within(@org.springframework.web.bind.annotation.RestController *)", throwing="ex") public void logAfterThrowing(JoinPoint joinPoint, Exception ex){ if(ex instanceof MethodArgumentNotValidException || ex instanceof ConstraintViolationException ){ StringBuilder sb=new StringBuilder(); sb.append("Invalid input parameters detected while calling method ").append(joinPoint.getSignature()).append(". "); // Add more detailed information about the exception here... log.error(sb.toString(), ex); } } } ``` 以上示例说明了怎样借助于AOP特性增强系统的健壮性和可追踪性,确保即使是在高并发情况下也能及时发现潜在问题所在[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值