я аннотации, определенным, как показано нижеSpring AOP аспект с аннотациями не работает для базового класса
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface OTPFlow {
}
и класс А, определенный ниже
public abstract class A {
@OTPFlow
public ModelAndView doSomething() {
//do something and return ModelAndView
}
}
класса B представляет собой контроллер определен, как показано ниже
@Controller
@RequestMapping(value = {"/someurl"})
public class B extends A {
@RequestMapping(value = {"/get"}, method = {RequestMethod.POST, RequestMethod.GET})
public ModelAndView get(HttpServletRequest request, HttpServletResponse response) {
return doSomething();
}
}
Аспект определяется как
@Component
@Aspect
public class OTPAspect {
private static final Logger logger = LoggerFactory.getLogger(OTPAspect.class);
@Pointcut("@annotation(OTPFlow)")
public void OTPFlow() {}
@Around("OTPFlow()")
public Object checkOTP(ProceedingJoinPoint joinPoint) {
try {
logger.info("Inside Aspect");
return joinPoint.proceed();
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
}
Проблема в том, что когда я обращаюсь к url "/ someurl/get", аспект не выполняется. Но когда я комментирую метод get get класса B, выполняется аспект.
Так что в основном аннотированные методы суперкласса не вызывают Аспект.
В чем проблема? Есть ли другой способ достичь этого? Любая помощь будет оценена по достоинству. Спасибо
Spring использует прокси, только вызовы метода INTO объекта перехватываются, вы внутренне вызываете метод. –
Здесь есть один вид «работы», который можно сделать, не прибегая к полной AspectJ. Просто создайте компонент «prototype scoped», который даст вам способ создать временный прокси (путем экземпляра экземпляра компонента), а затем, если у вас есть методы на этом компоненте, нацеленные на pointcuts, экземпляр bean будет его собственный прокси-сервер, и поэтому AOP * будет правильно вызван. Очевидно, вы использовали бы это только в ограниченных обстоятельствах и не делали бы его основной частью своей архитектуры, но в тех случаях, когда вам нужно то, что Spring AOP не может обеспечить, этот трюк «прототипа» может работать. –