2009-10-02 8 views
6

He intentado implementar la validación para mi aplicación web como se describe en la sección 5.7.4.3 de la documentación Spring 3.0:primavera JSR303 no funciona como se describe en la documentación de Primavera

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
      <property name="validator"> 
       <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> 
      </property> 
     </bean> 
    </property> 
</bean> 

He añadido hibernación-como un validador dependencia y todo se ve bien, pero a partir de los resultados de mi aplicaciones web en el siguiente error:

org.springframework.beans.NotWritablePropertyException: 
Invalid property 'validator' of bean class 
[org.springframework.web.bind.support.ConfigurableWebBindingInitializer]: 
Bean property 'validator' is not writable or has an invalid setter method. 
Does the parameter type of the setter match the return type of the getter? 

cuando se mira la API que es bastante obvio que algo anda mal. LocalValidatorFactoryBean implementa javax.validation.Validator mientras que ConfigurableWebBindingInitializer.setValidator() espera org.springframework.validation.Validator.

¿Alguna solución para esto?

EDITAR

Sobre LocalValidatorFactoryBean:

This is the central class for javax.validation (JSR-303) setup in a Spring application context: It bootstraps a javax.validation.ValidationFactory and exposes it through the Spring Validator interface as well as through the JSR-303 Validator interface and the ValidatorFactory interface itself.

Al igual que Alex Marshall declaró por debajo de este es no el caso. LocalValidatorFactoryBean solo implementa javax.validation.Validator.

LocalValidatorFactoryBean extiende SpringValidatorAdapter, que implementa org.springframework.validation.Validator.

+0

También intenté actualizar a 'hibernate-core-3.5.0.Beta-1' pero el código de Spring Hibernate no es compatible con esta versión. – Koraktor

+1

Se abrió un problema de JIRA en http://jira.springframework.org/browse/SPR-6189. – Koraktor

Respuesta

6

Aquí hay una solución para este problema:

Usando la configuración del bean validator de mi pregunta anterior, debe agregar el siguiente código en cada controlador usando la validación.

@Autowired 
private javax.validation.Validator validator; 

@InitBinder 
protected void initBinder(WebDataBinder binder) { 
    binder.setValidator((org.springframework.validation.Validator) this.validator); 
} 

Es sucio, pero funciona porque LocalValidatorFactoryBean extiende SpringValidatorAdapter y esto pone en práctica org.springframework.validation.Validator.

4

Si mira el Javadocs for ConfigurableWebBindingInitializer, su propiedad 'validator' es del tipo 'org.springframework.validation.Validator'. Si luego mira el Javadocs for LocalValidatorFactoryBean, verá que en realidad no implementa FactoryBean (para crear un org.springframework.validation.Validator) ni implementa org.springframework.validation.Validator en sí, por lo que el bean que está dando la propiedad 'validator' de ConfigurableWebBindingInitializer es del tipo incorrecto, como lo indica el error. Sospecho que esto es un descuido (bruto?) Por parte de los desarrolladores de Spring, y se debe crear un problema para esto en su seguimiento de incidencias de JIRA en jira.springframework.org

+0

Entonces mi primera sospecha fue correcta. Gracias por confirmar eso. Intentaré presentar un error. – Koraktor

+1

No es justo llamarlo un descuido total, dado que Spring 3 todavía está en pruebas. – skaffman

Cuestiones relacionadas