2012-06-04 27 views
7

tengo el proyecto de servicio REST integrado con la primavera. Estoy tratando de integrar la validación de bean. he hecho una anotación de encargo:

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


Con
@Constraint (validatedBy = {} INotEmptyValidator.class) que se especifica la interfaz de validación.
Esta es la implementación del validador.

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

Hice una costumbre Validador de restricción de fábrica

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

y configurado como este

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

Cuando invoco validar en el servicio de un grano que tiene un campo anotada como esto

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

consigo

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 

y sé java.lang.ClassCastException: $ Proxy84 no se puede convertir a Clazz es una excepción de la primavera clásico cuando usted no utiliza interfaces de pero aquí yo uso y NotEmpty si una anotación

Por favor, ¿qué hago mal? Muchas gracias por su tiempo.

ps. utilizo estas versiones de marcos

<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> 
+0

¿Cómo es 'NotEmptyValidatorImpl.java: 18'? –

+0

¿Qué quieres decir con "look"? – pguzun

+0

La línea exacta no coincide, pero el método NotEmptyValidatorImpl.initialize() es emtpty – pguzun

Respuesta

7

Quiero agradecerles a cada uno por su tiempo en este tema.
El error proviene de otras anotaciones implementadas que tienen este validador de restricciones. @Constraint(validatedBy = {INotEmptyValidator.class}). Esto se hizo seguro por error.

Finalmente Este es el buen ejemplo de hacer la validación de bean especificando el validador de restricción @Constraint(validatedBy = {INotEmptyValidator.class}) como interfaz. La implementación NotEmptyValidatorImpl es un grano de primavera.

+0

Tuve un problema similar. Olvidé poner @Component o ... en la clase MyValidator y obtuve estas Excepciones – Hamedz

1

Compruebe sus importaciones. Creo que ha importado en algún lugar por error éste: org.hibernate.validator.constraints.NotEmpty En lugar de: com.backend.rest.validation.validator.NotEmpty

+0

gracias por repetir, volví a comprobarlos, tienen razón – pguzun

0
No

realmente una respuesta a su pregunta, pero ¿ha considerado utilizar la restricción @NotEmpty que viene con Hibernate Validator?

+0

NotEmpty aquí es solo un ejemplo de validación personalizada – pguzun

1

Como un lado, esta misma excepción ocurrirá si su expresión regular tiene un error de sintaxis. Vine aquí antes de encontrar que un error de sintaxis era mi problema.

No te sirvo de ayuda, pero espero poder ahorrarle a un futuro pobre alma alguna búsqueda adicional.

Cuestiones relacionadas