AOP — отмена или последующее выполнение по рекомендации

#java #kotlin #aop #spring-aop

Вопрос:

Я пишу аннотацию, которая должна выполнить некоторые проверки для MessageId перед выполнением функции.

 @Aspect
@Component
class ValidatorAspect {
    @Before("@annotation(whatever.Validator)")
    fun checkMessage(joinPoint: JoinPoint) {
        val messageId = joinPoint.args[1] as String
        // run some validations
        // if any validation fails, this should stop execution
        // and annotated function not be called
    }
}
 

И моя функция снабжена комментариями:

     @Validator
    @SqsListener("myqueue")
    fun run(message: String) {
         // code to proccess message
    }

 

Порядок вызывается правильно: сначала SqsListener получает сообщение, затем мой валидатор должен быть выполнен перед аннотированной функцией.

Как я могу принудительно остановить выполнение run() ? Если какая — либо проверка не пройдет, я не хочу, чтобы этот аннотированный класс вызывался-кроме того, я не хочу создавать исключение, я ищу что-то гладкое, просто остановитесь, никаких исключений 🙂

Я пытался использовать @Around , но мой совет был вызван после моей функции run()

Есть какие-нибудь идеи или предложения?

Ответ №1:

В @Before этом случае у вас нет другого выбора , кроме как создать исключение, если вы хотите, чтобы программа не вводила перехваченный метод. По-видимому, вы хотите избежать создания исключения, поэтому @Around здесь вы хотите использовать тип совета.

Я пытался использовать @Around , но мой совет был вызван после моей функции run()

При всем моем уважении, это невозможно. Вы получаете доступ к точке соединения до ее вызова, вот как это работает. Может быть, вы случайно позвонили joinpoint.proceed() перед проверкой. Конечно, вы должны сделать это наоборот, сначала проверив, а затем решив, хотите ли вы продолжить или просто вернуть альтернативный результат без продолжения.