即使我们在catch块中处理异常,如何使用@ControllerAdvice在Spring中处理异常

时间:2019-07-20 13:38:33

标签: java spring

当方法被try和catch块包围时,无法使用@ControllerAdvice和@AfterThrowing。

我可以逐步解释

步骤1:在我的spring应用程序中,所有处理程序(方法)都是通过try and catch块处理异常的。

步骤2:因此,要求我需要在所有处理程序方法中都发生异常时触发电子邮件。但是我的应用程序有100多种方法。因此,尝试使用@ControllerAdvice通过使用@ExceptionHandler批注来处理异常。我知道它不会起作用,因为我们已经在catch代码块中处理了异常。因此,它无法查看@ControllerAdvice。

第3步:我也尝试使用Aop @AfterThrowing建议。它不起作用。因此,我无法删除整个应用程序代码中的所有catch块。做到这一点非常困难。

但是我的问题是     春天,即使我们正在处理异常,也有什么方法可以处理它    我们返回状态码,例如400。在春季,他们会提供有关识别状态码的任何建议。
    因为正在将ResponseEntity Status退回作为响应。

@RequestMapping(value = "/service/getDetails", method = RequestMethod.POST, produces = { "application/json" })
public ResponseEntity<Map<String, Object>> getDetails(@RequestBody Details details, HttpServletRequest request) {
    ResponseEntity<Map<String, Object>> response = null;
    try {
        /// Some code
    } catch (Exception e) {
        logger.error("Exception while DetailsController: " + e.getMessage());
        response = new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        /*
         * int status=response.getStatusCodeValue();
         * scheduledMailTrigerService.sendErrorLogInfo(request,e,status);
         */
    }
    return response;
}

  @ControllerAdvice
  public class AppExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(value = { Exception.class })
public String handleAnyException(Exception ex, WebRequest request) {
    System.out.println("Done");
    return "Done";
}

}

1 个答案:

答案 0 :(得分:0)

您可以使用@Around通知来捕获方法执行的结果...我的建议是从所有端点中删除try捕获,只需编写包裹 ProceedingJoinPoint <的try捕获< / strong> proceed()执行。这样,您可以在发生异常时返回 ResponseEntity 400 ,并执行电子邮件发送逻辑。