How to solve the casting problem java.lang.ClassCastException: $ Proxies cannot be passed to NotEmpty, which is an annotation

I have a REST service project integrated with spring. I am trying to integrate bean validation. I made a custom annotation:

/** * 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 "{error.notEmpty}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } 


FROM
@Constraint (validatedBy = {INotEmptyValidator.class}) I specified the validator interface.
This is a validator implementation.

  /** * 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); } } 

I made a custom constraint for Factory validator

  /** * 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 <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> key) { Map<String, T> beansByNames = applicationContext.getBeansOfType(key); if (beansByNames.isEmpty()) { try { return key.newInstance(); } catch (InstantiationException e) { throw new RuntimeException("Could not instantiate constraint validator class '" + key.getName() + "'", e); } catch (IllegalAccessException e) { throw new RuntimeException("Could not instantiate constraint validator class '" + key.getName() + "'", e); } } if (beansByNames.size() > 1) { throw new RuntimeException("Only one bean of type '" + key.getName() + "' is allowed in the application context"); } return (T) beansByNames.values().iterator().next(); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { Assert.notNull(applicationContext, "applicationContext can not be null"); this.applicationContext = applicationContext; } } 

and set it up like this:

 <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" > <property name="constraintValidatorFactory" ref="constraintValidatorFactory"/> </bean> <bean id="constraintValidatorFactory" class="com...NeoSpringConstraintValidatorFactory" > </bean> 

When I call a check in a service on a bean that has a field annotated in this way

 /** * The User value object definition * * @author pguzun */ @XmlRootElement() @XmlAccessorType(XmlAccessType.FIELD) public class UserVO { @XmlElement private long id; @NotEmpty(error = Error.EmailVoid) private String email; 

I get

  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 

and I know java.lang.ClassCastException: $ Proxy84 cannot be dropped in Clazz - this is a classic spring exception when you do not use interfaces but here I use NotEmpty si annotation

Tell me what am I doing wrong? Thanks so much for your time.

ps. I use these versions of frameworks

  <properties> <spring.version>3.1.1.RELEASE</spring.version> <hibernate.version>4.1.3.Final</hibernate.version> <jersey.version>1.12</jersey.version> <validation.api.version>1.0.0.GA</validation.api.version> <hibernate.validator.version>4.3.0.Final</hibernate.validator.version> 
+7
source share
4 answers

I want to thank you for spending time on this issue.
The error comes from other implemented annotations that have this constraint checking mechanism. @Constraint(validatedBy = {INotEmptyValidator.class}) . This was done by mistake.

Finally, this is a good example of performing bean validation defining the constratint @Constraint(validatedBy = {INotEmptyValidator.class}) as an interface. The implementation of NotEmptyValidatorImpl is a spring bean.

+7
source

Check your import. I think that you imported somewhere by mistake this: org.hibernate.validator.constraints.NotEmpty Instead: com.backend.rest.validation.validator.NotEmpty

+1
source

As an aside, the same exception will happen if your regular expression has a syntax error. I came here before I discovered that the syntax error was my problem.

Do not help you, but I hope to save the future poor soul by some additional search.

+1
source

Not really the answer to your question, but did you think you were using the @NotEmpty constraint that is related to the Hibernate Validator?

0
source

All Articles