[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] A transaction question
|
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 <javadeveloper999@xxxxxxxxxxx>:
>
> 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.
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>