#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
выше вашего класса MyCustomAsspect5. @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)
на самом деле решаемая проблема.