title: How to solve cast issue java.lang.ClassCastException: $Proxy cannot be cast to NotEmpty which is annotation
body: <p>I have a REST service project integrated with spring. I am trying to integrate bean validation. I have made a custom annotation:</p>
  <pre><code> /**
    * Denotes a field as being no empty.
    *
    * @author pguzun
    */
   @Target({METHOD, FIELD, ANNOTATION_TYPE})
   @Retention(RUNTIME)
   @Constraint(validatedBy = {INotEmptyValidator.class})
   public @interface NotEmpty {
  
      Error error() default Error.ServerError;
  
      String message() default &quot;{error.notEmpty}&quot;;
  
      Class&lt;?&gt;[] groups() default {};
  
      Class&lt;? extends Payload&gt;[] payload() default {};
  }
  </code></pre>
  <p>With</p>
  <pre><code>@Constraint(validatedBy = {INotEmptyValidator.class})
  </code></pre>
  <p>I specified the validator interface.</p>
  <p>This is the validator implementation.</p>
  <pre><code> /**
    * Checks that a String is not empty.
    *
    * @see StringUtils#isEmpty(java.lang.CharSequence)
    * @author pguzun
    */
  @Component
  public class NotEmptyValidatorImpl implements INotEmptyValidator {
  
  
   @Override
   public void initialize(NotEmpty notEmpty) {
       // NOTHING TO DO
   }
  
   @Override
   public boolean isValid(String value, ConstraintValidatorContext context) {
       return !StringUtils.isEmpty(value);
   }
  }
  </code></pre>
  <p>I did make a custom Validator Constraint Factory</p>
  <pre><code>    /**
      * Is custom an {@link ConstraintValidatorFactory }. Engine for defining factory
      * methods for {@link ConstraintValidator}'s.
      *
      * @author pguzun
      */
      public class NeoSpringConstraintValidatorFactory implements ConstraintValidatorFactory, ApplicationContextAware {
  
          private ApplicationContext applicationContext;
  
          public NeoSpringConstraintValidatorFactory() {
          }
  
          @Override
          public &lt;T extends ConstraintValidator&lt;?, ?&gt;&gt; T getInstance(Class&lt;T&gt; key) {
              Map&lt;String, T&gt; beansByNames = applicationContext.getBeansOfType(key);
              if (beansByNames.isEmpty()) {
                  try {
                      return key.newInstance();
                  } catch (InstantiationException e) {
                      throw new RuntimeException(&quot;Could not instantiate constraint validator class '&quot; + key.getName() + &quot;'&quot;, e);
                  } catch (IllegalAccessException e) {
                      throw new RuntimeException(&quot;Could not instantiate constraint validator class '&quot; + key.getName() + &quot;'&quot;, e);
                  }
              }
              if (beansByNames.size() &gt; 1) {
                  throw new RuntimeException(&quot;Only one bean of type '&quot; + key.getName() + &quot;' is allowed in the application context&quot;);
              }
              return (T) beansByNames.values().iterator().next();
          }
  
          @Override
          public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
              Assert.notNull(applicationContext, &quot;applicationContext can not be null&quot;);
              this.applicationContext = applicationContext;
          }
      }
  </code></pre>
  <p>and configured it like this</p>
  <pre><code>&lt;bean id=&quot;validator&quot; class=&quot;org.springframework.validation.beanvalidation.LocalValidatorFactoryBean&quot; &gt;
      &lt;property name=&quot;constraintValidatorFactory&quot; ref=&quot;constraintValidatorFactory&quot;/&gt; 
  &lt;/bean&gt;
  &lt;bean id=&quot;constraintValidatorFactory&quot; class=&quot;com...NeoSpringConstraintValidatorFactory&quot; &gt;
  &lt;/bean&gt;
  </code></pre>
  <p>When I invoke validate in service on a bean that has a field annotated like this</p>
  <pre><code>/**
  * The User's value object definition
  *
  * @author pguzun
  */
  @XmlRootElement()
  @XmlAccessorType(XmlAccessType.FIELD)
  public class UserVO {
  
      @XmlElement
      private long id;
      @NotEmpty(error = Error.EmailVoid)
      private String email;   
  </code></pre>
  <p>I get</p>
  <pre><code>    SEVERE: Servlet.service() for servlet jersey-serlvet threw exception
      javax.validation.ValidationException: HV000032: Unable to initialize com.backend.rest.validation.validator.NotEmptyValidatorImpl.
          at org.hibernate.validator.internal.engine.ConstraintTree.initializeConstraint(ConstraintTree.java:450)
          at org.hibernate.validator.internal.engine.ConstraintTree.createAndInitializeValidator(ConstraintTree.java:352)
          at org.hibernate.validator.internal.engine.ConstraintTree.getInitializedValidator(ConstraintTree.java:334)
          at org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:155)
          at org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:125)
          at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:86)
          at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:442)
          at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:387)
          at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:351)
          at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:303)
          at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:133)
          at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:194)
          at com.backend.rest.UserResourceImpl.validateGuest(UserResourceImpl.java:100)
          at com.backend.rest.UserResourceImpl.register(UserResourceImpl.java:77)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:597)
          at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
          at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185)
          at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
          at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
          at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
          at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
          at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
          at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1483)
          at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1414)
          at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1363)
          at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1353)
          at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:414)
          at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
          at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
          at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
          at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
          at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
          at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
          at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
          at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
          at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
          at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:191)
          at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java)
          at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
          at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
          at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
          at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
          at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
          at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
          at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
          at java.lang.Thread.run(Thread.java:662)
      Caused by: java.lang.ClassCastException: $Proxy84 cannot be cast to com.backend.rest.validation.validator.NotEmpty
          at com.backend.rest.validation.validator.NotEmptyValidatorImpl.initialize(NotEmptyValidatorImpl.java:18)
          at org.hibernate.validator.internal.engine.ConstraintTree.initializeConstraint(ConstraintTree.java:447)
          ... 49 more
      Jun 4, 2012 1:36:57 PM org.apache.catalina.core.StandardWrapperValve invoke
      SEVERE: Servlet.service() for servlet jersey-serlvet threw exception
      javax.validation.ValidationException: HV000032: Unable to initialize com.backend.rest.validation.validator.NotEmptyValidatorImpl.
          at org.hibernate.validator.internal.engine.ConstraintTree.initializeConstraint(ConstraintTree.java:450)
          at org.hibernate.validator.internal.engine.ConstraintTree.createAndInitializeValidator(ConstraintTree.java:352)
          at org.hibernate.validator.internal.engine.ConstraintTree.getInitializedValidator(ConstraintTree.java:334)
          at org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:155)
          at org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:125)
          at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:86)
          at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:442)
          at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:387)
          at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:351)
          at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:303)
          at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:133)
          at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:194)
          at com.backend.rest.UserResourceImpl.validateGuest(UserResourceImpl.java:100)
          at com.backend.rest.UserResourceImpl.register(UserResourceImpl.java:77)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:597)
          at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
          at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185)
          at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
          at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
          at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
          at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
          at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
          at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1483)
          at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1414)
          at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1363)
          at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1353)
          at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:414)
          at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
          at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
          at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
          at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
          at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
          at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
          at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
          at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
          at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
          at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:191)
          at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java)
          at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
          at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
          at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
          at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
          at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
          at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
          at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
          at java.lang.Thread.run(Thread.java:662)
      Caused by: java.lang.ClassCastException: $Proxy84 cannot be cast to com.backend.rest.validation.validator.NotEmpty
          at com.backend.rest.validation.validator.NotEmptyValidatorImpl.initialize(NotEmptyValidatorImpl.java:18)
          at org.hibernate.validator.internal.engine.ConstraintTree.initializeConstraint(ConstraintTree.java:447)
          ... 49 more
  </code></pre>
  <p>and I know java.lang.ClassCastException: $Proxy84 cannot be cast to Clazz is a clasic spring exception when you don't use interfaces
  but here I do use and NotEmpty si an annotation</p>
  <p>Please tell what do I do wrong?</p>
  <p>ps. I use this versions of frameworks</p>
  <pre><code>   &lt;properties&gt;
      &lt;spring.version&gt;3.1.1.RELEASE&lt;/spring.version&gt;
      &lt;hibernate.version&gt;4.1.3.Final&lt;/hibernate.version&gt;
      &lt;jersey.version&gt;1.12&lt;/jersey.version&gt;
      &lt;validation.api.version&gt;1.0.0.GA&lt;/validation.api.version&gt;
      &lt;hibernate.validator.version&gt;4.3.0.Final&lt;/hibernate.validator.version&gt;
  </code></pre>