Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Issue with collecting AspectJ pointcut context and avoiding mentioning all arguments of the advised method

I believe you want the following:

Your pointcut:


public pointcut advertisementBelongsToMemberControllerCheck(long advertisementId, Member member) 
        : execution(@AdvertisementExistsAndBelongsToMemberCheck * * (..)) 
        && args(*, advertisementId, *, member, ..);

Your advice:


before(long advertisementId, Member member) : advertisementBelongsToMemberControllerCheck(advertisementId, member) {
        if (!advertisementService.advertisementExistsAndBelongsToMember(advertisementId, member)) {
            throw new AccessDeniedException("Advertisement does not belong to member!");
        }
    }



On Wed, Sep 18, 2013 at 2:06 PM, Julien Martin <balteo@xxxxxxxxx> wrote:
Thanks a lot for your reply Andy,

One last point: does it make sense to write the following?

My pointcut:


public pointcut advertisementBelongsToMemberControllerCheck(*, long advertisementId, *, Member member) 
        : execution(@AdvertisementExistsAndBelongsToMemberCheck * * (..)) 
        && args(*,advertisementId, *,  member,..);

My advice:


before(*, long advertisementId, *, Member member) : advertisementBelongsToMemberControllerCheck(*,advertisementId, *,  member) {
        if (!advertisementService.advertisementExistsAndBelongsToMember(advertisementId, member)) {
            throw new AccessDeniedException("Advertisement does not belong to member!");
        }
    }

Regards,

J.


2013/9/18 Andy Clement <andrew.clement@xxxxxxxxx>
args() can include '*' and '..' - this gives you a little flexibility, maybe not quite as much as you'd like, but some.


args(familyAdvertisementInfo,advertisementId, model,  member);
could be written as:

args(*,advertisementId,*,member,..)

meaning you want the 2nd and 4th parameter and you don't care about 1 or 2 or any after the 4th.  There have been discussions over the users about using .. in multiple places but we don't support that at the moment.

Andy


On 18 September 2013 04:25, Julien Martin <balteo@xxxxxxxxx> wrote:

Hello,

I use AspectJ in order to check whether an object does belong to the current user. The advised method is actually a Spring MVC controller method. I use an annotation placed on that controller method in order to apply the crosscutting security advice.

The issue I have is that the controller method has quite a few arguments. I would like to avoid mentioning all arguments in the aspectJ source because those can change (argument name, type, etc.) but I still have to collect the pointcut context.

My pointcut:


public pointcut advertisementBelongsToMemberControllerCheck(FamilyAdvertisementInfo familyAdvertisementInfo, long advertisementId, Model model, Member member) 
        : execution(@AdvertisementExistsAndBelongsToMemberCheck * * (..)) 
        && args(familyAdvertisementInfo,advertisementId, model,  member);

My advice:


before(FamilyAdvertisementInfo familyAdvertisementInfo, long advertisementId, Model model, Member member) : advertisementBelongsToMemberControllerCheck(familyAdvertisementInfo,advertisementId, model,  member) {
        if (!advertisementService.advertisementExistsAndBelongsToMember(advertisementId, member)) {
            throw new AccessDeniedException("Advertisement does not belong to member!");
        }
    }

The annotation:


@Retention(RetentionPolicy.RUNTIME)
public @interface AdvertisementExistsAndBelongsToMemberCheck {

}

And finally, the advised controller method:


@RequestMapping(value = "/family/edit/{advertisementId}", method = RequestMethod.GET, produces = "text/html")
@AdvertisementExistsAndBelongsToMemberCheck
public String editFamilyAdvertisementForm(@ModelAttribute FamilyAdvertisementInfo familyAdvertisementInfo, @PathVariable long advertisementId, Model model, @CurrentMember Member member/* the currently logged in user */) {
        FamilyAdvertisement advertisement = advertisementService.findFamilyAdvertisement(advertisementId);
        familyAdvertisementInfo.setFamilyAdvertisement(advertisement);
        populateFamilyAdvertisementModel(model, familyAdvertisementInfo, member);
        return "advertisement/family/edit";
    }

To sum up, of the N arguments present in the method, I only need to use two (member and advertisementId). How can I avoid mentioning the N arguments?

Thanks in advance,

J.

_______________________________________________
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



_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users




--
mailto:matthew@xxxxxxxxxxxxxxx 
skype:matthewadams12
googletalk:matthew@xxxxxxxxxxxxxxx
http://matthewadams.me
http://www.linkedin.com/in/matthewadams

Back to the top