Пользовательская аннотация Spring AOP не работает для метода по умолчанию - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь добавить уже работающую аннотацию AOP вокруг нового метода в классе, где он уже размещен. Он не работает для нового метода, который я определил в качестве метода по умолчанию для интерфейса (не работает, даже если не переопределен), и я не могу найти причину этого. Код:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PaymentPlanLocking {}
@Aspect
@Component
public class PaymentPlanLockAspect
{
..
@Around("@annotation(PaymentPlanLocking)")
    public Object paymentPlanLocking(ProceedingJoinPoint joinPoint) throws Throwable
    {
..
public interface PaymentOrchestratorService<RQ, RS>
{

    /**
     * @param request to validate
     */
    void validate(RQ request) throws PaymentServiceException;

    /**
     * @param request to execute
     * @return response
     */
    RS execute(RQ request) throws PaymentServiceException;

    /**
     * @param request to execute
     * @return response
     */
    default RS doExecute(RQ request) throws PaymentServiceException{
        throw new RuntimeException("please override this method in subclass if using old model with execute-wrapped");
    }

}
@Service("holdPaymentService")
public class HoldPaymentOrchestrationService extends AbstractService<HoldResponse, HoldRequest>
        implements PaymentOrchestratorService<HoldRequest, HoldResponse>
{
...

@PaymentPlanLocking
    @Override
    public HoldResponse execute(HoldRequest holdRequest) throws PaymentServiceException

@PaymentPlanLocking
    @Override
    public HoldResponse doExecute(HoldRequest holdRequest) throws PaymentServiceException

Перехват работает для execute (HoldRequest holdRequest) , но не для doExecute (HoldRequest holdRequest) . Пожалуйста, помогите мне исправить это.

1 Ответ

1 голос
/ 17 января 2020

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

  @PaymentPlanLocking
  @Override
  public HoldResponse execute(HoldRequest holdRequest) throws PaymentServiceException {
    return doExecute(holdRequest);
  }

  @PaymentPlanLocking
  @Override
  public HoldResponse doExecute(HoldRequest holdRequest) throws PaymentServiceException {
    return new HoldResponse();
  }

Классическая ошибка новичка в Spring AOP полагать, что это работает, даже если хотя это явно задокументировано в противном случае (ищите термин "самовывоз").

Таким образом, проблема была не в коде, который вы показали в своем вопросе, а в коде Вы решили скрыться от нас. Обращаем ваше внимание на то, почему MCVE в каждом вопросе так важен, и задайте вопрос в следующий раз. Спасибо.

...