AOP Spring @AfterReturning неправильно вызывает метод aspects

#java #spring #aop #spring-aop #aspect

#java #весна #aop #spring-aop #аспект

Вопрос:

У меня есть аннотация.

 
@Target(value = {ElementType.METHOD, ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface MyCustomAnnotation{

}
  

Мой класс Aspect такой

 
@Component
@Aspect
public class MyCustomAsspect{

    @AfterReturning(
            pointcut="@annotation(MyCustomAnnotation)",
            returning="retVal")
    public void publishMessage(JoinPoint jp, Object retVal) throws Throwable {


    }
}

  

Мой класс обслуживания

 @Service
public class ServiceClass{

@MyCustomAnnotation
public Object someMethod(){
return new Object();
}

}
  

Выше упомянуты классы, я не уверен, почему мой аспект не работает. Я новичок в Spring AOP. Пожалуйста, помогите мне, я буду очень благодарен.

Комментарии:

1. В чем именно заключается ваша точка отсечения?

2. У вас отсутствует или неправильно вырезана точка

3. @annotation(MyCustomAnnotation) это моя точка отсечения

4. Попробуйте добавить @EnableAspectJAutoProxy выше вашего класса MyCustomAsspect

5. @BishalJaiswal он уже присутствует в моем классе SpringBootApplication

Ответ №1:

Проблема связана с объявлением pointcut . Как говорится в документации spring

@annotation — ограничивает соответствие точкам соединения, в которых объект точки соединения (метод, выполняемый в Spring AOP) имеет заданную аннотацию

Итак, я приказываю сделать эту работу

 @Aspect
public class MyCustomAsspect{

    @AfterReturning(
            pointcut="execution(public * *(..)) and @annotation(MyCustomAnnotation)",
            returning="retVal")
    public void publishMessage(JoinPoint jp, Object retVal) throws Throwable {


    }
}
  

Комментарии:

1. Я понятия не имею, почему OP принял этот ответ, потому что IMO это не решает проблему. Дополнительное execution(public * *(..)) and никак не меняет поведение аспекта. Итак, что бы ни решало проблему OP, это должно было быть что-то другое. Я просто комментирую это, чтобы никто не поверил, что это реальное решение. Например, гораздо более вероятно, что что-то вроде полного имени класса, такого как @annotation(my.package.MyCustomAnnotation) на самом деле решаемая проблема.