1 Reply Latest reply on Sep 24, 2015 4:50 AM by mkouba

    @WithAnnotations does not check interfaces for ProcessAnnotatedType

    davided80

      In Hibernate Validator we have created an extension to validate

      the parameter of a method called.

       

      The extension looks like this:

       

      public class ValidationExtension implements Extension {

       

        ...

       

        public <T> void processAnnotatedType(@Observes @WithAnnotations({ Constraint.class, Valid.class, ValidateOnExecution.class }) ProcessAnnotatedType<T> processAnnotatedTypeEvent) {

          ...

        }

      }

       

      You can see the whole file on GitHub: https://github.com/hibernate/hibernate-validator/blob/master/cdi/src/main/java/org/hibernate/validator/internal/cdi/ValidationExtension.java#L219

       

      Our current use case is the deployment of a WAR with a JSF ManagedBean that calls a StatelessBean, this are the classes in short:

       

      Managed Bean:

       

      @javax.faces.bean.ManagedBean(name = "greeter", eager = true)

      public class Greeter {

        @Inject

        private StatelessBeanInterface bean;

       

        public String getMessage() {

          return bean.lookup( null );

        }

      }

       

      Stateless bean interface:

       

      public interface StatelessBeanInterface {

        String lookup(@NotNull String text);

      }

       

      Stateless bean implementation:

       

      @Stateless

      public class StatelessBean implements StatelessBeanInterface {

        @Override

        public String lookup(String text) {

          ...

        }

      }

       

      This commit add a test case to hibernate validator and show all the classes: https://github.com/DavideD/hibernate-validator/commit/9e86edcb87c6b1698ce64620680a1171cb713bff

       

      The problem we are having is that the stateless bean is not validated because ValidationExtension#processAnnotatedType does not get called as expected.

       

      Everything works fine if I apply one of the following changes:

      - add @NotNull to the signature of the implementation and not the interface;

      - remove the @WithAnnotations

       

      It seems the problem is that the annotation is defined on the interface instead of the class implementing it.

      Is this expected? Am I doing something wrong?

       

      Thanks,

      Davide