Spring @Around Aspect 在一个控制器中被忽略,但在另一个控制器中却没有
Spring @Around Aspect being ignored in one controller but not in other one
我有一个奇怪的问题 - 我的方面在一个特定的控制器中被忽略,但在其他控制器中有效...
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
{
...
}
}
所以一个控制器在另一个工作时被忽略...
有什么想法吗?
我看到你的方法 NotPingController.notPing() 是一个受保护的方法。
根据 spring's documentation“由于 Spring 的 AOP 框架基于代理的性质,根据定义,受保护的方法不会被拦截”
你能不能试试做那个方法public看看有没有被拦截
我有一个奇怪的问题 - 我的方面在一个特定的控制器中被忽略,但在其他控制器中有效...
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
{
...
}
}
所以一个控制器在另一个工作时被忽略... 有什么想法吗?
我看到你的方法 NotPingController.notPing() 是一个受保护的方法。
根据 spring's documentation“由于 Spring 的 AOP 框架基于代理的性质,根据定义,受保护的方法不会被拦截”
你能不能试试做那个方法public看看有没有被拦截