当前位置: 首页 > 知识库问答 >
问题:

spring aop中如何截获aspect抛出的异常

欧阳正卿
2023-03-14
@Aspect
public class AuthorizationAspect {
  @Pointcut("@annotation(AuthenticateAccount)")
    public void authorized() {}

   private boolean isAuthorized() {
   // logic to check is user is authorised to call the api
   }

    @Before("authorized()")
    public void beforeControllerCall(JoinPoint joinPoint) throws UnauthorizedException {

        if(!isAuthorized)) {
            throw new UnauthorizedException("You don't have rights over this API");
        }

    }
}

通过抛出异常,我可以防止对API的访问,但它不会返回我试图抛出异常的有意义的消息。

有人使用这样的用例并能帮助我吗?

共有1个答案

桂丰
2023-03-14

您可以使用@ControllerAdvise使用全局异常处理。创建您的自定义异常并从方面类抛出该异常。您可以创建@ControllerAdvise注释类,如下所示:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = {UnauthorizedException.class})
    public ResponseEntity<Object> handleException(UnauthorizedException ex){
        return new ResponseEntity<Object>(
      ex.getMessage(), new HttpHeaders(), HttpStatus.FORBIDDEN);
    }

}

编辑:

请在下面找到spring boot全局异常处理代码

@RestController
public class DemoController {

    @GetMapping("/hello")
    String hello(){
        return "Message from controller if there is no exception";
    }
}
public class AuthException extends Exception{
    AuthException(String msg){
        super(msg);
    }
}
@Aspect
@Component
public class AopValidator {

    @Before("execution(String hello())")
     public void test() throws AuthException{
         throw new AuthException("Exception message from AOP on unauthorized access");
     }
}
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(AuthException.class)
    ResponseEntity<Object> handleException(AuthException ex){
        return new ResponseEntity<>(ex.getMessage(), new HttpHeaders(), HttpStatus.FORBIDDEN);
    }
}
 类似资料:
  • 我有一个方面类,用于记录使用泛型方法之前和之后(周围)的方法执行情况: 在方法中,我抛出了一个在logMethod中捕获的可抛出异常,并抛出了一个自定义异常,而不是类型 在我的控制器建议中,我有以下内容: 项目结构: 控制台:

  • 我有这样的情况,即活动调用管理器类调用提供者。 活动->管理器(带有asyncTask的方法)->提供程序 我应该如何将捕获的异常发送回活动?

  • 是否有可能在Delphi中构建一个代码片段,使假设的EChuckNorrisException无法捕获? 对于Java编程语言,我刚刚发现在Uncatchable ChuckNorriseException中,答案是肯定的

  • 在你可以捕获异常之前,一些代码必须抛出一个异常。任何代码都可能会抛出异常:您的代码,来自其他人编写的包(例如Java平台附带的包)或Java运行时环境的代码。无论是什么引发的异常,它总是通过 throw 语句抛出。 您可能已经注意到,Java平台提供了许多异常类。所有类都是Throwable类的后代,并且都允许程序区分在程序执行期间可能发生的各种类型的异常。 您还可以创建自己的异常类来表示在您编写

  • 我知道JVM有一个异常表,它映射在给定字节码索引中可以抛出的可能异常。我还读到athrow字节码抛出了堆栈顶部存在的引用类型的exception。我的问题更多地涉及像irem这样的指令如何“抛出”异常。 JVM是否会在每次指令执行后检查堆栈的顶部,以检查是否存在异常?如果你能洞察到这件事的话,你会很感激的。

  • 嘿StackOverflow社区, 关于抛出异常。一般什么时候抛出和异常,什么时候抓取? 假设我遇到了这样的情况,我不得不退出,因为发生了一些问题,我无法从它中恢复过来。我是投还是接? 我现在就这么做: 这样做对吗?如果我只是抛出异常会更合适吗?对不起,我是例外的新手:)