2014-11-21 2 views
0

Я перепробовал много комбинаций, но я не могу вызвать функцию обратного вызова перед выполнением следующего методаКак написать выражение AspectJ AOP для этого метода?

@SomeAnnotation(...) 
@Override 
public void someMethod(Serializable id) { 

} 

Я пытался много комбинаций, аналогичных

@Before("execution(@com.full.name.of.SomeAnnotation * com.full.name.of.Class.someMethod(java.io.Serializable))") 
public void beforeMethod() { 
    System.out.println("I am here."); 
} 

Если я пишу более общий expession, она попадет beforeMethod, но я не могу настроить таргетинг на один конкретный метод. Что мне здесь не хватает?

+0

Вопрос неясен. Пожалуйста, отредактируйте и скажите мне, что вы хотите совместить. Что такое «более общее выражение»? Вы хотите совместить все методы с этой аннотацией? Что-то другое? Нужно ли привязать аннотацию к параметру, чтобы получить доступ к его параметрам? Я не люблю догадываться, поэтому, пожалуйста, уточните. Тогда я легко смогу вам помочь. – kriegaex

+0

@kriegaex, я хочу совместить один метод «someMethod».Более общим я имею в виду: если я пытаюсь настроить все методы класса, это работает, но я не знаю, как сопоставить один и только один метод, определение которого приведено выше –

+0

Но вы знаете! Ваш собственный пример делает именно это. Что с этим не так? Я думал, вы хотите каким-то образом обобщить. – kriegaex

ответ

0

Почему вы не просто использовать

@Before("execution(* com.full.name.of.Class.someMethod(java.io.Serializable))") 

Что конкретно цели метод, который вы хотите, вам не нужно ставить аннотации указать целевой

+0

Это не работает, поскольку содержит синтаксическую ошибку. Вам нужно указать, по крайней мере, тип возвращаемого значения в сигнатуре метода, то есть предварять '*' или 'void'. – kriegaex

+0

Добавлен забытый «*». Я хотел бы воспользоваться этой возможностью, чтобы обратиться к рекомендациям SO о том, как использовать downvoting: «Используйте ваши downvotes всякий раз, когда вы сталкиваетесь с грубым, неряшливым, без усилий материалом, или ответ, который явно и, возможно, опасно неверен», и «Даун-голосование должно быть зарезервировано для крайних случаев», «Вместо голосования вниз. Если что-то не так, пожалуйста, оставьте комментарий или отредактируйте сообщение, чтобы исправить его». Случайная синтаксическая ошибка не соответствует приведенным выше критериям. Пожалуйста, уважайте тот факт, что некоторые из нас не являются охотниками за головами, просто люди, пытающиеся помочь с личного времени. Спасибо – Marios

+0

Я уважаю ваш комментарий. Пожалуйста, обратите внимание, что я не рассматриваю не только все, что не является моим собственным ответом, возможно, я выполняю 5-120 downvotes в месяц. Я всегда рассматриваю ситуацию: мы имеем дело с очевидным начинающим AspectJ здесь, поэтому, если вы представите ему фиктивный, непроверенный однострочный шрифт, он, возможно, даже не сможет узнать, что не так. В этом отношении я считаю, что нисходящий союз заслуживает внимания. И, пожалуйста, уважайте тот факт, что я тоже делаю это в свое свободное время, я здесь не новичок и потратил гораздо больше времени, помогая людям, чем вы, - бесплатно, как и вы. – kriegaex

0

Выражение ниже должно работать:

@Before("com.full.name.of.Class.someMethod(..) && args(java.io.Serializable)")

Коррекция kriegaex:

@Before("execution(* com.full.name.of.Class.someMethod(*)) && args(java.io.Serializable)") 

Несколько моментов, которые стоит рассмотреть: Является ли метод общедоступным? Используете ли вы cglib-прокси или прокси-серверы jdk? Поддерживает ли ваш класс какой-либо интерфейс и является ли метод, объявленный в договоре интерфейса?

сделать Также обратите внимание на то, что весной документе должен сказать о writing good pointcuts

Надеются, что это помогает.

+0

Это, похоже, не имеет никакого смысла. Как вы можете связать аргумент с сигнатурой метода с пустым списком параметров? – kriegaex

+1

@kriegaex изменил выражение pointcut. Это работает. Проверено. – Atul

+0

@Atul, спасибо, я дам ему попробовать через некоторое время, дадут вам знать –

1

Хорошо, ребята, позвольте мне доказать, что pointcut фактически работает как написано оригинальным плакатом Haris Hasan.

Пример аннотации:

package com.full.name.of; 

import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 

@Retention(RetentionPolicy.RUNTIME) 
public @interface SomeAnnotation { 
    int id(); 
    String name(); 
} 

Пример класса с помощью аннотации:

package com.full.name.of; 

import java.io.Serializable; 

public class Class { 
    @SomeAnnotation(id = 1, name = "John Doe") 
    public void someMethod(Serializable s) {} 

    public static void main(String[] args) { 
     new Class().someMethod("x"); 
    } 
} 

Sample аспект с точным срезом точек Haris Хасана:

package de.scrum_master.aspect; 

import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 

@Aspect 
public class SampleAspect { 
    @Before("execution(@com.full.name.of.SomeAnnotation * com.full.name.of.Class.someMethod(java.io.Serializable))") 
    public void yetAnotherPointcut(JoinPoint thisJoinPoint) { 
     System.out.println(thisJoinPoint); 
    } 
} 

Консоль вывода:

execution(void com.full.name.of.Class.someMethod(Serializable)) 

Скопируйте и вставьте все точно так, как есть, а затем запустить его. Quod erat демонстрационный.

+0

Большое спасибо, моя проблема заключалась в том, что someMethod вызывается из класса. AOP работает только тогда, когда метод вызывается через proxy.Я соответственно меняю свою реализацию.Спасибо –

+1

Какой урок мы узнаем из этого? В следующий раз, когда вы обратитесь за помощью сюда, делитесь не только фрагментами, но и полностью компилируемым и исполняемым образцом, оптимально [SSCCE] (http://sscce.org/). :-) Кстати, если вы хотите перехватить внутренние вызовы, вы не можете использовать прокси-основанную Spring AOP, вам нужно переключиться на полный AspectJ. Весеннее руководство, [Раздел 9.8, Использование AspectJ с приложениями Spring] (http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/aop.html#aop-using-aspectj), объясняет, как это сделать что через ткачество нагрузки. – kriegaex

Смежные вопросы