2012-06-04 7 views
7

Ho un progetto di servizio REST integrato con la molla. Sto cercando di integrare la convalida del bean. ho fatto un'annotazione personalizzato:

/** 
    * 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) ho specificato l'interfaccia validatore.
Questa è l'implementazione del validatore.

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

ho fatto fare un validatore vincolo fabbrica

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

e configurato in questo modo

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

Quando invoco convalidare in servizio su un fagiolo che ha un campo annotato come questo

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

Ottengo

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 

e so java.lang.ClassCastException: $ Proxy84 non può essere lanciato a Clazz è un'eccezione primavera clasic quando tu non utilizzare le interfacce ma qui io faccio uso e notempty si un'annotazione

Si prega di dire cosa faccio di sbagliato? Grazie mille per il vostro tempo.

ps. Io uso questa versione di quadri

<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

Come appare "NotEmptyValidatorImpl.java: 18'? –

+0

Cosa intendi per aspetto? – pguzun

+0

La riga esatta non corrisponde ma il metodo NotEmptyValidatorImpl.initialize() è emtpty – pguzun

risposta

7

Voglio ringraziarvi tutti per aver dedicato del tempo a questo problema.
L'errore deriva da altre annotazioni implementate che hanno questo validatore di vincoli. @Constraint(validatedBy = {INotEmptyValidator.class}). Questo è stato fatto per errore.

Infine Questo è l'esempio corretto della convalida del bean che specifica il validatore di constratint @Constraint(validatedBy = {INotEmptyValidator.class}) come interfaccia. L'implementazione NotEmptyValidatorImpl è un bean a molla.

+0

Ho avuto problemi simili. Ho dimenticato di mettere @Component o ... alla classe MyValidator e ho ottenuto queste eccezioni – Hamedz

1

Controlla le tue importazioni. Penso che è stato importato da qualche parte per sbaglio questo: org.hibernate.validator.constraints.NotEmpty Invece di: com.backend.rest.validation.validator.NotEmpty

+0

grazie per la riproduzione, ho ricontrollato, hanno ragione – pguzun

0

Non proprio una risposta alla tua domanda, ma avete considerato di utilizzare il vincolo @NotEmpty che viene fornito con Hibernate Validator?

+0

NotEmpty qui è solo un esempio di convalida personalizzata – pguzun

1

Come una parte, questa stessa eccezione si verificherà se la tua espressione regolare ha un errore di sintassi. Sono venuto qui prima di scoprire che un errore di sintassi era il mio problema.

Non ti è di aiuto, ma spero di salvare un'anima povera in futuro qualche ricerca aggiuntiva.

Problemi correlati