Spring @Around Aspect игнорируется в одном контроллере, но не в другом - PullRequest
1 голос
/ 02 мая 2019

У меня странная проблема - мой аспект игнорируется в одном конкретном контроллере, но работает в других ...

context.xml включает в себя:

<mvc:annotation-driven />
<task:annotation-driven />
<aop:aspectj-autoproxy />
<context:spring-configured />
<context:component-scan base-package="com.my.package.address.aspect"/>
<context:component-scan base-package="com.my.package.address.controllers" />

объявление аспектов:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DoWork {
}

сам аспект:

@Aspect
@Configurable
public class DoWorkAspect {

    @Around("@annotation(com.my.package.address.aspect.DoWork)")
  public Object doWork(ProceedingJoinPoint joinPoint) throws Throwable {
      ...
  }
}

контроллер, на котором работает аспект (работает):

@Controller
@RequestMapping(value = "/ping")
@Validated
public class PingController {

    @DoWork
    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    @ResponseBody
    public PingResponse ping(@PathVariable("id") String id) throws Exception {
        return new PingResponse("ok");
    }

и контроллер, который аспект игнорирует:

@Controller
@RequestMapping(value = "/not_ping")
public class NotPingController
{
    @DoWork
    @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
    @ResponseStatus(value = HttpStatus.OK)
    protected void notPing(
         @PathVariable("id") String id
         ) throws
            IOException,
            NotAuthorizedException
    {
        ...
    }
}

То есть один контроллер игнорируется, а другой работает ... Есть идеи, почему?

1 Ответ

2 голосов
/ 02 мая 2019

Я вижу ваш метод NotPingController.notPing () является защищенным методом.

Согласно документации Spring" Из-за природы на основе проксив среде Spring AOP, защищенные методы по определению не перехватываются"

Можете ли вы попробовать сделать этот метод общедоступным и проверить, был ли он перехвачен или нет

...