Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] A transaction question

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 <javadeveloper999@xxxxxxxxxxx> wrote:
> 
>> From: neo anderson <javadeveloper999@xxxxxxxxxxx>
>> Subject: [aspectj-users] A transaction question
>> To: aspectj-users@xxxxxxxxxxx
>> 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@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>> 
> 
> 
> 
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> 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.



Back to the top