Как перехватить исключение, выброшенное из аспекта весной AOP - PullRequest
0 голосов
/ 29 августа 2018

Есть ли способ перехватить исключение и показать значимое сообщение конечному клиенту? Я пытаюсь авторизовать мой API с помощью Spring AOP, и если конечный пользователь не авторизован для доступа к API, я выдаю исключение.

@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 Ответ

0 голосов
/ 29 августа 2018

Вы можете использовать глобальную обработку исключений, используя @ControllerAdvice. Создайте свое собственное исключение и сгенерируйте это исключение из класса Aspect. Вы можете создать @ControllerAdvice аннотированный класс следующим образом:

@ControllerAdvice
public class GlobalExceptionHandler {

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

}

EDIT:

Ниже приведен код глобальной обработки исключений для весенней загрузки:

DemoController.java

@RestController
public class DemoController {

    @GetMapping("/hello")
    String hello(){
        return "Message from controller if there is no exception";
    }
}

AuthException .java

public class AuthException extends Exception{
    AuthException(String msg){
        super(msg);
    }
}

AopValidator .java

@Aspect
@Component
public class AopValidator {

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

GlobalExceptionHandler.java

@ControllerAdvice
public class GlobalExceptionHandler {

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