[ 
https://issues.apache.org/jira/browse/BVAL-174?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16925350#comment-16925350
 ] 

David Blevins commented on BVAL-174:
------------------------------------

The change in ReturnValueD seems to make things worse and add a level of 
strictness that was not there before.

 

With this change if there is one method with an UnexpectedTypeException it will 
cause *all* methods including the constructor to throw UnexpectedTypeException.

 

Before the bean could still be constructed and used, but the validation check 
would fail when that particular method was called.  Now in the the 
@AroundConstruct of BValInterceptor the call to 
`validator.getConstraintsForClass(ctor.getDeclaringClass())` will fail despite 
there being no issue with the constructor.  Net result is the bean will deploy, 
but fail to instantiate at runtime.

 

We should maybe either remove this check or make ReturnValueD something that is 
lazily constructed.

 

Thoughts?

 

> Return Parameter Validation Ignore void methods
> -----------------------------------------------
>
>                 Key: BVAL-174
>                 URL: https://issues.apache.org/jira/browse/BVAL-174
>             Project: BVal
>          Issue Type: Improvement
>    Affects Versions: 2.0.0
>            Reporter: David Blevins
>            Priority: Major
>             Fix For: 2.0.3
>
>         Attachments: BVAL-174.patch
>
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> Given the following annotation:
> {code:java}
> import javax.validation.ConstraintValidator;
> import javax.validation.ConstraintValidatorContext;
> import javax.validation.Payload;
> import java.lang.annotation.Documented;
> import java.lang.annotation.Retention;
> import java.lang.annotation.Target;
> import java.util.Set;
> import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
> import static java.lang.annotation.ElementType.METHOD;
> import static java.lang.annotation.RetentionPolicy.RUNTIME;
> @Documented
> @javax.validation.Constraint(validatedBy = {Audience.Constraint.class})
> @Target({METHOD, ANNOTATION_TYPE})
> @Retention(RUNTIME)
> public @interface Audience {
>     String value();
>     Class<?>[] groups() default {};
>     String message() default "The 'aud' claim must contain '{value}'";
>     Class<? extends Payload>[] payload() default {};
>     class Constraint implements ConstraintValidator<Audience, JsonWebToken> {
>         private Audience audience;
>         @Override
>         public void initialize(final Audience constraint) {
>             this.audience = constraint;
>         }
>         @Override
>         public boolean isValid(final JsonWebToken value, final 
> ConstraintValidatorContext context) {
>             final Set<String> audience = value.getAudience();
>             return audience != null && 
> audience.contains(this.audience.value());
>         }
>     }
> }
> {code}
> BVal wil successfully avoid throwing errors when placed on a method like the 
> following:
> {code:java}
>     @GET
>     @Path("foo")
>     @Audience("movies")
>     @RolesAllowed({"manager", "user"})
>     public Movie getMovie() {
>         return new Movie(1, "The Matrix", "Lana Wachowski");
>     }
> {code}
> However on a method that returns void an exception will be throwing stating 
> BVal cannot find a ConstraintValidator for return type void.
> {code:java}
>     @POST
>     @Audience("movies")
>     @RolesAllowed("manager")
>     public void addMovie(Movie newMovie) {
>         store.put(newMovie.getId(), newMovie);
>     }
> {code}
> If the BValInterceptor is updated to ignore checking return values of void 
> methods, it appears to pass the Bean Validation TCK and solves the issue.



--
This message was sent by Atlassian Jira
(v8.3.2#803003)

Reply via email to