• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Jeanne Boyarsky
  • Ron McLeod
  • Paul Clapham
  • Liutauras Vilda
Sheriffs:
  • paul wheaton
  • Rob Spoor
  • Devaka Cooray
Saloon Keepers:
  • Stephan van Hulst
  • Tim Holloway
  • Carey Brown
  • Frits Walraven
  • Tim Moores
Bartenders:
  • Mikalai Zaikin

Spring AOP: How can I create pointcut for middle argument ?

 
Ranch Hand
Posts: 38
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
If argument is unique - I can write:

If argument is first:

If argument is last:

But if it is in the middle the following fails:


How can I do it ?
 
ranger
Posts: 17347
11
Mac IntelliJ IDE Spring
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
It might work with a specific type.

So if you have a possible joinpoint like

public void doSomething(String s, Integer i, Order order)

args(anArg)

@Pointcut (value = "args(anArg)")
private void pointcut(Integer anArg) {}

Then Spring would use reflection and see that you are referring to the second argument of doSomething, by examining its type.

Mark
 
Boris Romashov
Ranch Hand
Posts: 38
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

Mark Spritzler wrote:


As I wrote in first message, your version points only to methods with unique argument.
That is not what I need.
 
Mark Spritzler
ranger
Posts: 17347
11
Mac IntelliJ IDE Spring
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
How about

args(*, myObject, ..)

Mark
 
Boris Romashov
Ranch Hand
Posts: 38
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

Mark Spritzler wrote:How about
args(*, myObject, ..)


This only works when myObject is second argument.
 
Mark Spritzler
ranger
Posts: 17347
11
Mac IntelliJ IDE Spring
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
So then what exactly do you mean by middle parameter? How many parameters?

If ther eis nothing to grab onto, some pattern, that is where I find creating my own Annotation and creating a Pointcut that matches the methods. But I think that might still nto completely solve your problem, which only leaves creating pointcuts that combine pointcuts with &&(and), || (not), ! (or)

Mark
 
Boris Romashov
Ranch Hand
Posts: 38
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

Mark Spritzler wrote:So then what exactly do you mean by middle parameter?


Middle means anything except of first and last - no matter how many parameters are present.

Creating annotation and marking all methods that fit my requirement is a solution with some limitations.
What if there are a lot of methods? If my pattern changes I need to look through all annotated methods.
What if these methods are not in my classes (that's why I cannot edit them).
So I want to do it in by one pointcut without editing classes.
Besides, this information can be successfully calculated without any marking. When argument is first and last it is very easy.
Why this cannot be easy for middle argument?
 
Greenhorn
Posts: 6
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Boris Romashov,

Did you get a solution for this issue ? Please update.

I came up with a workaround for this. Since i know the number of arguments the method (inherited from interface) will take, i used * in place of other arguments and named the parameter of my concern. Then i was able to use it.

like


this worked for me.

Please update if you have found a way to fix this, if the number of arguments is unknown.


Thanks
 
Don't get me started about those stupid light bulbs.
reply
    Bookmark Topic Watch Topic
  • New Topic