[weld-dev] @WithAnnotations filtering not picking up annotations from implemented interfaces

Martin Kouba mkouba at redhat.com
Wed May 2 12:56:03 EDT 2018


Dne 2.5.2018 v 17:57 Marko Bekhta napsal(a):
> Ahh, I see, it's a part of the spec. So basically if we wanted to do it 
> the other
> way there's no other option then remove the @WithAnnotations, receive all
> PATs and do the filtering on our side, right?

Yes. In theory, we could implement something weld-specific but then your 
extension would not be portable.

> 
> And also thanks for a quick response!
> 
> Have a nice day,
> Marko
> 
> 
> 2018-05-02 17:25 GMT+02:00 Martin Kouba <mkouba at redhat.com 
> <mailto:mkouba at redhat.com>>:
>
>     Hi Marko,
> 
>     comments inline...
> 
>     Dne 2.5.2018 v 16:57 Marko Bekhta napsal(a):
> 
>         Hi all,
> 
>         In Hibernate Validator CDI extension we are using
>         @WithAnnotations to filter
>         beans that potentially need to be validated (for actual usage
>         see [1]):
> 
>         public <T> void processAnnotatedType(@Observes @WithAnnotations({
>         Constraint.class,
>         Valid.class,
>         ValidateOnExecution.class
>         }) ProcessAnnotatedType<T> processAnnotatedTypeEvent) {
>         // doing something ...
>         }
> 
>         The problem that we've stumbled upon is that it looks like this
>         filtering does
>         not take into account the information from implemented
>         interfaces. For example
>         let's assume we have an interface:
> 
>         @ValidateOnExecution(type = ExecutableType.ALL)
>         public interface ShipmentService {
>         public void findShipment(@NotNull String id);
>         }
> 
>         which is implemented by ShipmentServiceImpl:
> 
>         public class ShipmentServiceImpl implements ShipmentService {
> 
>         @Override
>         public void findShipment(String id) {
>         }
>         }
> 
>         Our expectation would be that as interface is marked with one of
>         the annotations
>         listed among values of @WithAnnotations filter, the
>         corresponding bean
>         (ShipmentServiceImpl) would be pushed to
>         processAnnotatedType(..) method. But it
>         is not. As a result we don't create a validation proxy and
>         corresponding service
>         bean never performs any validation operations.  In case when any
>         of the filtered
>         annotations is added to the impl bean things start to work (impl
>         bean is processed).
> 
>         The above case shows placement of annotation on a type level,
>         but similar
>         behavior is observed in cases when annotation is on a method level.
> 
>         As forcing presence of one of the annotations from the filter
>         list on a impl
>         beans is not really an option, an alternative could be to drop the
>         @WithAnnotations filtering completely. Which is also not that
>         great, as
>         dropping the filtering would mean that:
> 
>         - Validation extension would need to process all possible beans
>         that are available
>         - Such processing requires calls to Hibernate Validatior which
>         must create the metadata
>         for each bean hierarchy and store it, even if nobody actually
>         needs to validate those
>         beans.
>         - This would lead to much greater memory consumption as well as
>         longer bootstrap
>         time. Which is not good.
> 
>         Hence we would like to ask if there is any particular reasons
>         why @WithAnnotations
> 
> 
>     Well, the reason is that the spec requires this:
> 
>     "If the annotation is applied, the container must only deliver
>     ProcessAnnotatedType events for types which contain at least one of
>     the annotations specified. The annotation can appear on the
>     annotated type, or on any member, or any parameter of any member of
>     the annotated type, as defined in Alternative metadata sources."
> 
>     See also
>     http://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#process_annotated_type
>     <http://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#process_annotated_type>
> 
>     Annotations should be inherited (and PAT fired) if @Inherited
>     meta-annotation is used. But I'm not quite sure this works. Also
>     note that annotations are never inherited from interfaces (see also
>     java.lang.annotation.Inherited javadoc)!
> 
>         filter does not consider looking at super classes and
>         implemented interfaces to check
>         for annotations listed in @WithAnnotations?
> 
> 
> 
>         Have a nice day,
>         Marko
> 
>         [1]
>         https://github.com/hibernate/hibernate-validator/blob/master/cdi/src/main/java/org/hibernate/validator/cdi/ValidationExtension.java#L222
>         <https://github.com/hibernate/hibernate-validator/blob/master/cdi/src/main/java/org/hibernate/validator/cdi/ValidationExtension.java#L222>
> 
> 
>         _______________________________________________
>         weld-dev mailing list
>         weld-dev at lists.jboss.org <mailto:weld-dev at lists.jboss.org>
>         https://lists.jboss.org/mailman/listinfo/weld-dev
>         <https://lists.jboss.org/mailman/listinfo/weld-dev>
> 
> 
>     -- 
>     Martin Kouba
>     Senior Software Engineer
>     Red Hat, Czech Republic
> 
> 

-- 
Martin Kouba
Senior Software Engineer
Red Hat, Czech Republic


More information about the weld-dev mailing list