AOP AspectJ Pointcut if() выдает исключение ArrayIndexOutOfBoundsException:

Я пытаюсь написать Aspect, пытаясь реализовать условие if() Pointcut, но получая исключение ArrayIndexOutOfBoundsException. вот фрагмент кода.

@Pointcut("call(* com.aop.Service.activate(..)) && args(iActivate,..) && if()")
    public static boolean saveActivate(Activate iActivate) {
        return true; //if false @before she not be invoked
    };

@Before("saveActivate(iActivate)")
    public void saveActivateBefore(JoinPoint ijoinPoint, ActivateInstallmentRequest iActivateInstallmentRequest) {
        System.out.println("Log from @before");    
}

Этот код дает мне исключение ниже:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'objectMapperConfigurer' defined in class path resource [springfox/documentation/spring/web/SpringfoxWebMvcConfiguration.class]: Initialization of bean failed; nested exception is java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1

Может ли кто-нибудь помочь мне, что мне здесь не хватает? PS: я также упомянул AspectJ.


person Raghu    schedule 22.10.2020    source источник
comment
Прежде чем мы продолжим, я хочу перепроверить: вы на 100% уверены, что используете AspectJ, а не только Spring AOP? Вы явно настроили Spring для использования плетения во время загрузки? Другой вопрос заключается в том, действительно ли имя вашего целевого класса com.aop.service с буквой s в нижнем регистре. Обычно имена классов Java начинаются с заглавной буквы.   -  person kriegaex    schedule 23.10.2020
comment
@kriegaex - я использую Spring AOP в своем проекте. Основываясь на вашем комментарии, я предполагаю, что если для Pointcut только для AspectJ, но не для Spring AOP? com.aop.service — это произвольное имя, которое я дал в коде, не беспокойтесь об этом!   -  person Raghu    schedule 23.10.2020


Ответы (1)


После проверки того, что вы используете Spring AOP, ответ действительно таков, что и if(), и call() не поддерживаются, см. также раздел руководства Spring о обозначения pointcut.

Если вы хотите использовать эти обозначения, вам необходимо активировать AspectJ через LTW (переплетение во время загрузки).

Обходным путем для Spring AOP было бы просто использовать обычный if в начале вашего метода консультаций и, если нет конкретных причин для использования call(), вместо этого использовать execution(), что в любом случае требуется большинству людей. Я не буду здесь подробно рассказывать о разнице между точками соединения вызова и выполнения, но вы можете, например. обратитесь к моему ответу для получения дополнительной информации.


Обновление: есть и другие вещи, которые выглядят немного странно в вашем фрагменте кода, но то, что я объяснил, является самой большой проблемой на данный момент.

person kriegaex    schedule 23.10.2020