【问题标题】:Spring AOP @Pointcut not triggering @Before methodSpring AOP @Pointcut 不触发 @Before 方法
【发布时间】:2013-09-26 16:33:40
【问题描述】:

我有一个 @Aspect 和 @Pointcut 方法注释为触发 @Before 一个 @Controller 请求方法,它似乎匹配(因为我没有收到任何错误)但它根本没有触发我的建议方法。为了测试目的,我将切入点更改为尽可能具体,并且在应用程序启动期间没有遇到任何绑定错误。

这是我的控制器方法(类是 com.x.y.z.MyController):

@RequestMapping(method = RequestMethod.POST, produces = "application/json", consumes = "application/json")
@ResponseBody
public SubmissionResponse submitMethod(@Valid @RequestBody final SubmissionRequest request, HttpServletRequest httpRequest, BindingResult result)
{
    if (result.hasErrors()) { throw new BadRequestException(result); }

    //  ... do stuff ...
}

这是 Aspect 类:

@Aspect
@Component
public class RequestValidatingAspect
{
    private static final Logger LOGGER = Logger.getLogger(RequestValidatingAspect.class);

    @Inject
    private ClientService clientService;

    @Inject
    private AccountService accountService;

    @Pointcut("execution(* com.x.y.z.MyController.submitMethod(*.SubmissionRequest,*.HttpServletRequest,*.BindingResult)) && args(request, httpRequest, result)")
    private void requestValidation(SubmissionRequest request, HttpServletRequest httpRequest, BindingResult result) {} 

    @Before("requestValidation(request,httpRequest,result)")    
    public void theAdvice(SubmissionRequest request, HttpServletRequest httpRequest, BindingResult result) throws Throwable
    {
        System.out.println("Before - The Advice");
        LOGGER.info("Entering The Advice!");

        if(result.hasErrors()){ throw new BadRequestException(result); }
        // ... do stuff ...

        LOGGER.info("Exiting - The Advice!");
        return;
    }
}

【问题讨论】:

  • 我们可以看看你的上下文吗?

标签: java spring aop aspectj spring-aop


【解决方案1】:

原来@Pointcut 行并不完全正确。 改变:

.. submitMethod(*.SubmissionRequest,*.HttpServletRequest,*.BindingResult) ..

submitMethod(..) 或为具有相同args 过滤器的三个对象中的每一个使用完全限定的类名,可以让建议锁定我想要建议的不同方法。不过,我最终改变了我的方法,并创建了一个自定义注释来直接指示我想要建议的方法,并以这个最终切入点结束:

@Pointcut("@annotation(com.x.y.z.annotation.SpecificTypeOfRequestValidation) && args(request, httpRequest, result)")

【讨论】:

    【解决方案2】:

    如果您使用的是 Spring 4,那么您可以使用 @ControllerAdvice 注释来集中所有请求验证,从维护的角度来看这似乎更有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      相关资源
      最近更新 更多