You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Rural Hunter <ru...@gmail.com> on 2012/10/22 09:45:41 UTC

Can not get annotation instance on advised methods

Hi,

I have an annotation:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Audit
{
     String operate() default "";
     String desc() default "";
     int type();
     int idParamIndex() default 0;
}

I put on some methods of my DAO services and advised them in AppModule:

DAOInterface:
     @Audit(type=1)
     public void delete(int id) throws Exception;

AppModule:
         for (Method m : receiver.getInterface().getMethods())
         {
             if (m.getAnnotation(Audit.class) != null)
             {
                 System.out.println("advising "+m.getName());
                 receiver.adviseMethod(m, advice);
             }
         }

There is no problem and I can see the methods are advised by the 
System.out above. But in the advise method, I can not get the Audit 
annotation:
     public void advise(MethodInvocation invocation)
     {
         String methodName = invocation.getMethod().getName();
         Audit audit = invocation.getAnnotation(Audit.class);
         System.out.println("method="+methodName+", audit="+audit);
         invocation.proceed();
     }

The above advise method is called and I can see the system.out is always 
like this: "method=delete, audit=null". I need some information in the 
Audit annotation but why I can not get the annotation instance?


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Can not get annotation instance on advised methods

Posted by Rural Hunter <ru...@gmail.com>.
No, it does not seems what I wanted. It's a pity that the annotation is 
lost in plastic class transformation. I have to find other ways. thanks 
anyway.

于 2012/10/23 2:16, Taha Siddiqi 写道:
> May be I didn't get you but may be JpaTransactionAdvisorImpl can help. It uses @CommitAfter and checks the PersistenceContext using @PersistenceContext on the same method to get the context for which the method has to be advised.
>
>
> On Oct 22, 2012, at 8:22 PM, Rural Hunter wrote:
>
>> hmm...I think it won't work in any way trying to get the annotation from the method where plastic already removes the annotation...
>>
>> 于 2012/10/22 18:34, Taha Siddiqi 写道:
>>> May be get the annotation in the advisor implementation using MethodAdviceReceiver#getMethodAnnotation
>>>
>>>
>>> On Oct 22, 2012, at 3:11 PM, Rural Hunter wrote:
>>>
>>>> 于 2012/10/22 17:02, Taha Siddiqi 写道:
>>>>> Did you try invocation.getInstance().getAnnotation() ?
>>>> What is that for? I read the API and seems it's not what I needed. My annotation is on methods being advised, not on the class instance. I also tried invocation.getMethod().getAnnotations() and it returns an empty array. I just googled and found an old post:
>>>> http://tapestry.1045711.n5.nabble.com/Plastic-amp-proxy-annotations-td4453361.html
>>>>
>>>> Seems annotation is not copied for methods by plastic...If it's still true, is there anything else I can implement what I needed? My intention is to audit methods call on my DAO services, including user information from session, method names(or operation type: update/delete/insert etc.) and some parameters(to get record id etc.), which I planed to implement by service advising and annotation.
>>>>> On Oct 22, 2012, at 1:15 PM, Rural Hunter wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> I have an annotation:
>>>>>> @Documented
>>>>>> @Retention(RetentionPolicy.RUNTIME)
>>>>>> @Target(ElementType.METHOD)
>>>>>> public @interface Audit
>>>>>> {
>>>>>>     String operate() default "";
>>>>>>     String desc() default "";
>>>>>>     int type();
>>>>>>     int idParamIndex() default 0;
>>>>>> }
>>>>>>
>>>>>> I put on some methods of my DAO services and advised them in AppModule:
>>>>>>
>>>>>> DAOInterface:
>>>>>>     @Audit(type=1)
>>>>>>     public void delete(int id) throws Exception;
>>>>>>
>>>>>> AppModule:
>>>>>>         for (Method m : receiver.getInterface().getMethods())
>>>>>>         {
>>>>>>             if (m.getAnnotation(Audit.class) != null)
>>>>>>             {
>>>>>>                 System.out.println("advising "+m.getName());
>>>>>>                 receiver.adviseMethod(m, advice);
>>>>>>             }
>>>>>>         }
>>>>>>
>>>>>> There is no problem and I can see the methods are advised by the System.out above. But in the advise method, I can not get the Audit annotation:
>>>>>>     public void advise(MethodInvocation invocation)
>>>>>>     {
>>>>>>         String methodName = invocation.getMethod().getName();
>>>>>>         Audit audit = invocation.getAnnotation(Audit.class);
>>>>>>         System.out.println("method="+methodName+", audit="+audit);
>>>>>>         invocation.proceed();
>>>>>>     }
>>>>>>
>>>>>> The above advise method is called and I can see the system.out is always like this: "method=delete, audit=null". I need some information in the Audit annotation but why I can not get the annotation instance?
>>>>>>
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>>
>>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Can not get annotation instance on advised methods

Posted by Taha Siddiqi <ta...@gmail.com>.
May be I didn't get you but may be JpaTransactionAdvisorImpl can help. It uses @CommitAfter and checks the PersistenceContext using @PersistenceContext on the same method to get the context for which the method has to be advised. 


On Oct 22, 2012, at 8:22 PM, Rural Hunter wrote:

> hmm...I think it won't work in any way trying to get the annotation from the method where plastic already removes the annotation...
> 
> 于 2012/10/22 18:34, Taha Siddiqi 写道:
>> May be get the annotation in the advisor implementation using MethodAdviceReceiver#getMethodAnnotation
>> 
>> 
>> On Oct 22, 2012, at 3:11 PM, Rural Hunter wrote:
>> 
>>> 于 2012/10/22 17:02, Taha Siddiqi 写道:
>>>> Did you try invocation.getInstance().getAnnotation() ?
>>> What is that for? I read the API and seems it's not what I needed. My annotation is on methods being advised, not on the class instance. I also tried invocation.getMethod().getAnnotations() and it returns an empty array. I just googled and found an old post:
>>> http://tapestry.1045711.n5.nabble.com/Plastic-amp-proxy-annotations-td4453361.html
>>> 
>>> Seems annotation is not copied for methods by plastic...If it's still true, is there anything else I can implement what I needed? My intention is to audit methods call on my DAO services, including user information from session, method names(or operation type: update/delete/insert etc.) and some parameters(to get record id etc.), which I planed to implement by service advising and annotation.
>>>> On Oct 22, 2012, at 1:15 PM, Rural Hunter wrote:
>>>> 
>>>>> Hi,
>>>>> 
>>>>> I have an annotation:
>>>>> @Documented
>>>>> @Retention(RetentionPolicy.RUNTIME)
>>>>> @Target(ElementType.METHOD)
>>>>> public @interface Audit
>>>>> {
>>>>>    String operate() default "";
>>>>>    String desc() default "";
>>>>>    int type();
>>>>>    int idParamIndex() default 0;
>>>>> }
>>>>> 
>>>>> I put on some methods of my DAO services and advised them in AppModule:
>>>>> 
>>>>> DAOInterface:
>>>>>    @Audit(type=1)
>>>>>    public void delete(int id) throws Exception;
>>>>> 
>>>>> AppModule:
>>>>>        for (Method m : receiver.getInterface().getMethods())
>>>>>        {
>>>>>            if (m.getAnnotation(Audit.class) != null)
>>>>>            {
>>>>>                System.out.println("advising "+m.getName());
>>>>>                receiver.adviseMethod(m, advice);
>>>>>            }
>>>>>        }
>>>>> 
>>>>> There is no problem and I can see the methods are advised by the System.out above. But in the advise method, I can not get the Audit annotation:
>>>>>    public void advise(MethodInvocation invocation)
>>>>>    {
>>>>>        String methodName = invocation.getMethod().getName();
>>>>>        Audit audit = invocation.getAnnotation(Audit.class);
>>>>>        System.out.println("method="+methodName+", audit="+audit);
>>>>>        invocation.proceed();
>>>>>    }
>>>>> 
>>>>> The above advise method is called and I can see the system.out is always like this: "method=delete, audit=null". I need some information in the Audit annotation but why I can not get the annotation instance?
>>>>> 
>>>>> 
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>> 
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>> 
>>>> 
>>> 
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>> 
>> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Can not get annotation instance on advised methods

Posted by Rural Hunter <ru...@gmail.com>.
hmm...I think it won't work in any way trying to get the annotation from 
the method where plastic already removes the annotation...

于 2012/10/22 18:34, Taha Siddiqi 写道:
> May be get the annotation in the advisor implementation using MethodAdviceReceiver#getMethodAnnotation
>
>
> On Oct 22, 2012, at 3:11 PM, Rural Hunter wrote:
>
>> 于 2012/10/22 17:02, Taha Siddiqi 写道:
>>> Did you try invocation.getInstance().getAnnotation() ?
>> What is that for? I read the API and seems it's not what I needed. My annotation is on methods being advised, not on the class instance. I also tried invocation.getMethod().getAnnotations() and it returns an empty array. I just googled and found an old post:
>> http://tapestry.1045711.n5.nabble.com/Plastic-amp-proxy-annotations-td4453361.html
>>
>> Seems annotation is not copied for methods by plastic...If it's still true, is there anything else I can implement what I needed? My intention is to audit methods call on my DAO services, including user information from session, method names(or operation type: update/delete/insert etc.) and some parameters(to get record id etc.), which I planed to implement by service advising and annotation.
>>> On Oct 22, 2012, at 1:15 PM, Rural Hunter wrote:
>>>
>>>> Hi,
>>>>
>>>> I have an annotation:
>>>> @Documented
>>>> @Retention(RetentionPolicy.RUNTIME)
>>>> @Target(ElementType.METHOD)
>>>> public @interface Audit
>>>> {
>>>>     String operate() default "";
>>>>     String desc() default "";
>>>>     int type();
>>>>     int idParamIndex() default 0;
>>>> }
>>>>
>>>> I put on some methods of my DAO services and advised them in AppModule:
>>>>
>>>> DAOInterface:
>>>>     @Audit(type=1)
>>>>     public void delete(int id) throws Exception;
>>>>
>>>> AppModule:
>>>>         for (Method m : receiver.getInterface().getMethods())
>>>>         {
>>>>             if (m.getAnnotation(Audit.class) != null)
>>>>             {
>>>>                 System.out.println("advising "+m.getName());
>>>>                 receiver.adviseMethod(m, advice);
>>>>             }
>>>>         }
>>>>
>>>> There is no problem and I can see the methods are advised by the System.out above. But in the advise method, I can not get the Audit annotation:
>>>>     public void advise(MethodInvocation invocation)
>>>>     {
>>>>         String methodName = invocation.getMethod().getName();
>>>>         Audit audit = invocation.getAnnotation(Audit.class);
>>>>         System.out.println("method="+methodName+", audit="+audit);
>>>>         invocation.proceed();
>>>>     }
>>>>
>>>> The above advise method is called and I can see the system.out is always like this: "method=delete, audit=null". I need some information in the Audit annotation but why I can not get the annotation instance?
>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Can not get annotation instance on advised methods

Posted by Taha Siddiqi <ta...@gmail.com>.
May be get the annotation in the advisor implementation using MethodAdviceReceiver#getMethodAnnotation


On Oct 22, 2012, at 3:11 PM, Rural Hunter wrote:

> 于 2012/10/22 17:02, Taha Siddiqi 写道:
>> Did you try invocation.getInstance().getAnnotation() ?
> What is that for? I read the API and seems it's not what I needed. My annotation is on methods being advised, not on the class instance. I also tried invocation.getMethod().getAnnotations() and it returns an empty array. I just googled and found an old post:
> http://tapestry.1045711.n5.nabble.com/Plastic-amp-proxy-annotations-td4453361.html
> 
> Seems annotation is not copied for methods by plastic...If it's still true, is there anything else I can implement what I needed? My intention is to audit methods call on my DAO services, including user information from session, method names(or operation type: update/delete/insert etc.) and some parameters(to get record id etc.), which I planed to implement by service advising and annotation.
>> 
>> On Oct 22, 2012, at 1:15 PM, Rural Hunter wrote:
>> 
>>> Hi,
>>> 
>>> I have an annotation:
>>> @Documented
>>> @Retention(RetentionPolicy.RUNTIME)
>>> @Target(ElementType.METHOD)
>>> public @interface Audit
>>> {
>>>    String operate() default "";
>>>    String desc() default "";
>>>    int type();
>>>    int idParamIndex() default 0;
>>> }
>>> 
>>> I put on some methods of my DAO services and advised them in AppModule:
>>> 
>>> DAOInterface:
>>>    @Audit(type=1)
>>>    public void delete(int id) throws Exception;
>>> 
>>> AppModule:
>>>        for (Method m : receiver.getInterface().getMethods())
>>>        {
>>>            if (m.getAnnotation(Audit.class) != null)
>>>            {
>>>                System.out.println("advising "+m.getName());
>>>                receiver.adviseMethod(m, advice);
>>>            }
>>>        }
>>> 
>>> There is no problem and I can see the methods are advised by the System.out above. But in the advise method, I can not get the Audit annotation:
>>>    public void advise(MethodInvocation invocation)
>>>    {
>>>        String methodName = invocation.getMethod().getName();
>>>        Audit audit = invocation.getAnnotation(Audit.class);
>>>        System.out.println("method="+methodName+", audit="+audit);
>>>        invocation.proceed();
>>>    }
>>> 
>>> The above advise method is called and I can see the system.out is always like this: "method=delete, audit=null". I need some information in the Audit annotation but why I can not get the annotation instance?
>>> 
>>> 
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>> 
>> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Can not get annotation instance on advised methods

Posted by Rural Hunter <ru...@gmail.com>.
于 2012/10/22 17:02, Taha Siddiqi 写道:
> Did you try invocation.getInstance().getAnnotation() ?
What is that for? I read the API and seems it's not what I needed. My 
annotation is on methods being advised, not on the class instance. I 
also tried invocation.getMethod().getAnnotations() and it returns an 
empty array. I just googled and found an old post:
http://tapestry.1045711.n5.nabble.com/Plastic-amp-proxy-annotations-td4453361.html

Seems annotation is not copied for methods by plastic...If it's still 
true, is there anything else I can implement what I needed? My intention 
is to audit methods call on my DAO services, including user information 
from session, method names(or operation type: update/delete/insert etc.) 
and some parameters(to get record id etc.), which I planed to implement 
by service advising and annotation.
>
> On Oct 22, 2012, at 1:15 PM, Rural Hunter wrote:
>
>> Hi,
>>
>> I have an annotation:
>> @Documented
>> @Retention(RetentionPolicy.RUNTIME)
>> @Target(ElementType.METHOD)
>> public @interface Audit
>> {
>>     String operate() default "";
>>     String desc() default "";
>>     int type();
>>     int idParamIndex() default 0;
>> }
>>
>> I put on some methods of my DAO services and advised them in AppModule:
>>
>> DAOInterface:
>>     @Audit(type=1)
>>     public void delete(int id) throws Exception;
>>
>> AppModule:
>>         for (Method m : receiver.getInterface().getMethods())
>>         {
>>             if (m.getAnnotation(Audit.class) != null)
>>             {
>>                 System.out.println("advising "+m.getName());
>>                 receiver.adviseMethod(m, advice);
>>             }
>>         }
>>
>> There is no problem and I can see the methods are advised by the System.out above. But in the advise method, I can not get the Audit annotation:
>>     public void advise(MethodInvocation invocation)
>>     {
>>         String methodName = invocation.getMethod().getName();
>>         Audit audit = invocation.getAnnotation(Audit.class);
>>         System.out.println("method="+methodName+", audit="+audit);
>>         invocation.proceed();
>>     }
>>
>> The above advise method is called and I can see the system.out is always like this: "method=delete, audit=null". I need some information in the Audit annotation but why I can not get the annotation instance?
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Can not get annotation instance on advised methods

Posted by Taha Siddiqi <ta...@gmail.com>.
Did you try invocation.getInstance().getAnnotation() ?

On Oct 22, 2012, at 1:15 PM, Rural Hunter wrote:

> Hi,
> 
> I have an annotation:
> @Documented
> @Retention(RetentionPolicy.RUNTIME)
> @Target(ElementType.METHOD)
> public @interface Audit
> {
>    String operate() default "";
>    String desc() default "";
>    int type();
>    int idParamIndex() default 0;
> }
> 
> I put on some methods of my DAO services and advised them in AppModule:
> 
> DAOInterface:
>    @Audit(type=1)
>    public void delete(int id) throws Exception;
> 
> AppModule:
>        for (Method m : receiver.getInterface().getMethods())
>        {
>            if (m.getAnnotation(Audit.class) != null)
>            {
>                System.out.println("advising "+m.getName());
>                receiver.adviseMethod(m, advice);
>            }
>        }
> 
> There is no problem and I can see the methods are advised by the System.out above. But in the advise method, I can not get the Audit annotation:
>    public void advise(MethodInvocation invocation)
>    {
>        String methodName = invocation.getMethod().getName();
>        Audit audit = invocation.getAnnotation(Audit.class);
>        System.out.println("method="+methodName+", audit="+audit);
>        invocation.proceed();
>    }
> 
> The above advise method is called and I can see the system.out is always like this: "method=delete, audit=null". I need some information in the Audit annotation but why I can not get the annotation instance?
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org