#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()
перед проверкой. Конечно, вы должны сделать это наоборот, сначала проверив, а затем решив, хотите ли вы продолжить или просто вернуть альтернативный результат без продолжения.