Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Method & constructor validation pointcuts

Thanks, Andy.  That was it!

Very subtle -- it didn't cross my mind to consider parameter v. type
annotations there.  That's a gem -- maybe add it to the FAQ or quick
reference?

-matthew

On Tue, Sep 11, 2012 at 10:25 AM, Andy Clement <andrew.clement@xxxxxxxxx> wrote:
> Hi Matthew,
>
> From a quick look you don't appear to be using the right syntax for
> parameter annotations:
>
> pointcut executingValidatedConstructorParameters() :
> execution(*.new(.., @javax.validation.constraints..* *, ..));
>
> That means any constructor with a parameter *whose type* is annotated
> with an annotation from @javax.validation.constraints..*.
>
> The syntax is:
>
> execution(* *(..,@ParamAnnotation (@TypeAnnotation *),..))
>
> so if you are leaving out the TypeAnnotation, you still need the parens:
>
> execution(*.new(..,@javax.validation.constraints..* (*),..))
>
> so that the compiler can tell you mean param annotations and not type
> annotations.
>
> does that help?
>
> cheers,
> Andy
>
>
> On 10 September 2012 12:17, Matthew Adams <matthew@xxxxxxxxxxxxxxx> wrote:
>> Hi all,
>>
>> I'm trying to use a JSR-303 ValidationProvider (Apache BVal, to be
>> exact) along with an aspect to do POJO method & constructor
>> validation.  I'd like to apply before advice to validated constructors
>> & methods, and after advice to validated return values, where
>> "validated" means the following.
>>
>> Constructors:
>> * Any parameter is annotated with any javax.validation.constraints annotation
>>
>> Methods (all must be true):
>> * Nonstatic method
>> * Any parameter is annotated with any javax.validation.constraints annotation
>>
>> Return value (all must be true):
>> * Nonstatic method
>> * Method annotated with any javax.validation.constraints annotation
>>
>> Here are my pointcuts.
>>
>> pointcut executingValidatedConstructorParameters() :
>> execution(*.new(.., @javax.validation.constraints..* *, ..));
>>
>> pointcut executingInstanceMethod() : execution(!static * *(..));
>>
>> pointcut executingValidatedReturnValue() :
>> executingInstanceMethod() &&
>> execution((@javax.validation.constraints..* !void) *(..));
>>
>> pointcut executingValidatedMethodParameters() :
>> executingInstanceMethod() &&
>> execution(* *(.., @javax.validation.constraints..* *, ..));
>>
>> They don't match anything.
>>
>> If I add a criterion "execution(@Valid *.new(..))" to
>> executingValidatedConstructorParameters, and "execution(@Valid *
>> *(..))" to executingValidatedMethodParameters &
>> executingValidatedReturnValue, then they match ok, but require me to
>> put the @Valid annotation on the method or constructor **in addition
>> to** whatever other constraint annotations (like @NotNull) are there,
>> which I feel is redundant.  The presence of the actual constraint
>> annotation should be sufficient to trigger validation.
>>
>> Further, I noticed that if I change "@javax.validation.constraints..*"
>> to one of the actual constraint annotations,
>> "@javax.validation.constraints.NotNull", I get a new warning about
>> unmatched aspects:
>>
>> 'does not match because annotation
>> @javax.validation.constraints.NotNull has
>> @Target{ElementType.FIELD,ElementType.ANNOTATION_TYPE,ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.PARAMETER}
>> [Xlint:unmatchedTargetKind]'
>>
>> Then, I tried to change the annotation expression to match where
>> elementType includes ElementType.PARAMETER (and ElementType.METHOD for
>> executingValidatedReturnValue), but I couldn't figure out the syntax.
>>
>> So, how can I match constructors & methods where any parameter is
>> annotated with any javax.validation.constraints..* annotation, and
>> return values where the method is annotated with any
>> javax.validation.constraints..* annotation?
>>
>> Thanks,
>> Matthew
>> --
>> mailto:matthew@xxxxxxxxxxxxxxx
>> skype:matthewadams12
>> googletalk:matthew@xxxxxxxxxxxxxxx
>> http://matthewadams.me
>> http://www.linkedin.com/in/matthewadams
>> _______________________________________________
>> 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