Попытка сопоставить сигнатуру точки AspectJ для любых методов, содержащих переменную

Я хочу создать pointcut, соответствующий любому методу в моем веб-контроллере, содержащему ModelMap:

pointcut addMenu(ModelMap modelMap) : 
    execution (public String example.web.MyController.*(..)) && args (modelMap);

before(ModelMap modelMap) : addMenu(modelMap) {
    // Do stuff with modelMap...
}

Моя проблема в том, что это соответствует только методам с ТОЛЬКО параметром ModelMap, другие не сопоставляются, потому что содержат слишком много параметров. Например, это не перехватывается из-за параметра «req»:

public String request(HttpServletRequest req, ModelMap modelMap) {
    // Handle request
}

Есть ли способ сопоставить все методы с параметром ModelMap без добавления делегата pointcut для каждой возможной комбинации параметров?


person seanhodges    schedule 08.02.2010    source источник


Ответы (1)


Вы можете использовать подстановочные знаки * или .. для гибкого выражения аргументов.

pointcut addMenu(ModelMap modelMap) : 
    execution (public String example.web.MyController.*(..)) && args (*, modelMap);

См. AspectJ: параметр в pointcut

person ewernli    schedule 08.02.2010
comment
Спасибо. Это близко к тому, что я хочу, но это приводит к тому, что pointcut больше не соответствует моим методам запроса (ModelMap modelMap), потому что он ожидает более одного аргумента. - person seanhodges; 08.02.2010
comment
Да, эта проблема связана со связанным сообщением в моем ответе. Либо попробуй с.., либо сделай два pointcut*, modelMap и modelMap. - person ewernli; 08.02.2010