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