Spring @Around Aspect在一个控制器中被忽略,但在另一个控制器中未被忽略

时间:2019-05-02 12:12:34

标签: spring spring-mvc annotations aspectj spring-annotations

我有一个奇怪的问题-我的方面在一个特定的控制器中被忽略,但在其他控制器中起作用...

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 个答案:

答案 0 :(得分:2)

我看到您的方法 NotPingController.notPing()是受保护的方法。

根据spring's documentation由于Spring的AOP框架具有基于代理的性质,因此根据定义,受保护的方法不会被拦截

您可以尝试将该方法公开吗,并检查它是否被拦截