The method you are intercepting (setEntityManager) has a void return type, so your advice should too. The proceed() call you are using will ensure your replacement is passed to the setEntityManager call.
Andy 2009/11/4 neo anderson <javadeveloper...@yahoo.co.uk>: > > Hi Mark & Andy. Thanks for your reply. I really appreciate your help. > > I change to use args, but now it thorws message: > > [error] incompatible return type applying to method-call(void > example.AccountDao.setEntityManager(example.EntityManager)) > > [error] incompatible return type applying to method-call(void > example.AccountDao.setEntityManager(example.EntityManager)) > dao.setEntityManager(PersistenceCreator.createEntityManagerFactory().createEntityManager()); > > [warning] advice defined in example.AbstractTransaction has not been applied > [Xlint:adviceDidNotMatch] > > I check the syntax and read the example in e.g. > http://books.google.com.tw/books?id=AKuBlJGl7iUC&pg=PA54&lpg=PA54&dq=aspectj+call+args&source=bl&ots=58KGnyCZiN&sig=5gNdHoekFrDXJne3pVe6UO5tiYQ&hl=zh-TW&ei=kNbxSqTEBumgjAfdnp2WAQ&sa=X&oi=book_result&ct=result&resnum=6&ved=0CB0Q6AEwBQ#v=onepage&q=4-2%20capturing%20the%20parameter%20values%20passed%20on%20a%20method%20call&f=false > > The way to capture the EntityManager looks correct. > > public pointcut(EntityManager manager): call(* > AccountDao.setEntityManager(EntityManger)) && args(manager); > > Is there any place I may go wrong? I test to move the .aj files and compile > .java source. Everthing works fine. I am confused. > > I appreciate any suggestion. > > Thank you very much. > > > Mark Cooke-6 wrote: >> >> Hi, >> It's been a while since I've used AspectJ in anger but as no-one else has >> replied yet... >> >> I'd say you probably want "args(manager)" instead of "target(manager)" in >> the obtainEntityManager pointcut. >> The target of the call will be an AccountDAO, not an EntityManager. >> >> See >> http://www.eclipse.org/aspectj/doc/released/progguide/semantics-joinPoints.html >> >> HTH! >> Mark. >> >> --- On Wed, 4/11/09, neo anderson <javadeveloper...@yahoo.co.uk> wrote: >> >>> From: neo anderson <javadeveloper...@yahoo.co.uk> >>> Subject: [aspectj-users] A transaction question >>> To: aspectj-users@eclipse.org >>> Date: Wednesday, 4 November, 2009, 12:09 >>> >>> I am learning how to modulize transaction using aspectj, >>> but encounter a >>> problem that EntityManager I try to capture is always null. >>> The compiler >>> issues message saying that the advice can not be applied. >>> as below: >>> >>> ... advice defined in example.AbstractTransaction has not >>> been applied >>> [Xlint:adviceDidNotMatch] >>> >>> What should I change so that I can capture the >>> EntityManager while it is >>> created (whilst calling to >>> AccountDao.setEntityManager(..))? >>> >>> Thanks for help. >>> >>> Main.java >>> >>> package example; >>> >>> public class Main{ >>> public static void main(String args[]){ >>> Main m = new Main(); >>> m.process(); >>> } >>> void process(){ >>> AccountDao dao = new >>> AccountDao(); >>> >>> dao.setEntityManager(PersistenceCreator.createEntityManagerFactory().createEntityManager()); >>> User u = new >>> User("1", "Smith"); >>> u.setAddress("123 >>> Test Road, London."); >>> dao.save(u); >>> >>> >>> dao.list(); >>> } >>> } >>> >>> AccountDao.java >>> >>> package example; >>> >>> import java.util.List; >>> import java.util.ArrayList; >>> >>> >>> public class AccountDao{ >>> >>> private EntityManager manager; >>> >>> private static List<User> database >>> = new ArrayList<User>(); >>> >>> public void >>> setEntityManager(EntityManager manager){ >>> this.manager = >>> manager; >>> } >>> >>> public void save(User user){ >>> >>> database.add(user); >>> } >>> >>> public void list(){ >>> for(User u : >>> database){ >>> >>> System.out.println(">>>[AccountDao.java]"+u); >>> >>> } >>> } >>> } >>> >>> User.java >>> >>> package example; >>> >>> public class User{ >>> private String id; >>> private String name; >>> private String address; >>> public User(String id, String name){ >>> this.id = id; >>> this.name = name; >>> } >>> >>> public String getId(){ >>> return this.id; >>> } >>> >>> public String getName(){ >>> return this.name; >>> } >>> >>> public String getAddress(){ >>> return this.address; >>> } >>> >>> public void setAddress(String address){ >>> this.address = >>> address; >>> } >>> >>> public String toString(){ >>> return "<User >>> [id:"+id+"][name:"+name+"][address:"+address+"]>"; >>> } >>> } >>> >>> >>> PersistenceCreator.java >>> >>> package example; >>> >>> public class PersistenceCreator{ >>> private static EntityManagerFactory >>> factory; >>> >>> public static EntityManagerFactory >>> createEntityManagerFactory(){ >>> if(null == factory) >>> >>> factory = new EntityManagerFactory(); >>> return factory; >>> } >>> } >>> >>> EntityManagerFactory.java >>> >>> package example; >>> >>> public class EntityManagerFactory{ >>> >>> private static EntityManager manager; >>> >>> public static EntityManager >>> createEntityManager(){ >>> if(null == manager){ >>> >>> manager = new EntityManager(); >>> } >>> return manager; >>> } >>> } >>> >>> EntityManager.java >>> >>> package example; >>> >>> public class EntityManager{ >>> } >>> >>> AbstractTransaction.aj >>> >>> package example; >>> >>> public abstract aspect AbstractTransaction >>> percflow(scope()){ >>> >>> private EntityManager manager; >>> >>> protected abstract pointcut tx(); >>> >>> protected pointcut >>> obtainEntityManager(EntityManager manager): call(* >>> example.AccountDao.setEntityManager(EntityManager)) >>> && target(manager); >>> >>> protected pointcut scope(): tx() >>> && !cflowbelow(tx()); >>> >>> Object around(): scope(){ >>> >>> System.out.println("EntityManager:"+manager);// always null >>> >>> Object result = >>> proceed(); >>> return result; >>> } >>> >>> EntityManager around(EntityManager >>> manager): obtainEntityManager(manager) >>> && cflow(tx()){ >>> if(null == manager){ >>> >>> manager = proceed(manager); >>> >>> } >> >>> return manager; >>> } >>> } >>> >>> AccountTransaction.aj >>> >>> package example; >>> >>> public aspect AccountTransaction extends >>> AbstractTransaction{ >>> >>> protected pointcut tx(): execution(* >>> example.Main.process()); >>> } >>> -- >>> View this message in context: >>> http://old.nabble.com/A-transaction-question-tp26195112p26195112.html >>> Sent from the AspectJ - users mailing list archive at >>> Nabble.com. >>> >>> _______________________________________________ >>> aspectj-users mailing list >>> aspectj-users@eclipse.org >>> https://dev.eclipse.org/mailman/listinfo/aspectj-users >>> >> >> >> >> _______________________________________________ >> aspectj-users mailing list >> aspectj-users@eclipse.org >> https://dev.eclipse.org/mailman/listinfo/aspectj-users >> >> > > -- > View this message in context: > http://old.nabble.com/A-transaction-question-tp26195112p26203290.html > Sent from the AspectJ - users mailing list archive at Nabble.com. > > _______________________________________________ > aspectj-users mailing list > aspectj-users@eclipse.org > https://dev.eclipse.org/mailman/listinfo/aspectj-users > _______________________________________________ aspectj-users mailing list aspectj-users@eclipse.org https://dev.eclipse.org/mailman/listinfo/aspectj-users