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