2012-02-07 15 views
5

Estoy experimentando cierta confusión en el uso y el propósito de Spring's DataBinder y ConversionService con respecto a las solicitudes web vinculantes para modelar objetos. Esto ha surgido porque recientemente he intentado usar la validación JSR-303 al agregar.Diferencia entre DataBinder y ConversionService en Spring

Antes de esto he utilizado:

<bean 
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="mypackage.GlobalWebBindingInitializer" /> 
    </property> 
</bean> 

esto era bueno porque quería una DataBinder global que podría ser utilizado por varios controladores. Dentro de la clase GlobalWebBindingInitialzer poner en práctica varias de ellas:

binder.registerCustomEditor(MyClass.class, new PropertyEditorSupport(MyClass.class) 

Sin embargo quería utilizar la anotación @Valid y así añadido. El efecto secundario de esto es que el Bean AnnotationMethodHandlerAdapter ya está definido como parte de la anotación, por lo que mi carpeta de datos global se ignora.

Así que ahora han creado esta clase:

public class MyClassConverter implements Converter<String, MyClass> 

estoy confundido. Si quiero usar ¿debería usar el servicio de conversión en lugar de databinder?

Respuesta

3

Históricamente, el enlace de datos de Spring se usaba para convertir datos en JavaBeans. Se basa en gran medida en JavaBean PropertyEditors para hacer la conversión.

Spring 3.0 added new and different support para conversiones y formateo. Algunos de los cambios incluyeron un paquete "core.convert" y un paquete "format" que según los documentos "se pueden usar como alternativas más simples a PropertyEditors".

Ahora, para responder a su pregunta, sí, parece que está en el camino correcto. Puede seguir utilizando cualquiera de los dos, pero, para no hacer historia, en muchos casos debería poder usar un convertidor en lugar de un encuadernador de datos.

Documentación acerca de cómo agregar la validación is available online.

1

Más información en la respuesta anterior Los editores de propiedad (esp PropertyEditorSupport) no son seguros para subprocesos, lo que es especialmente necesario en un entorno web donde cada solicitud se sirve en un subproceso independiente. Teóricamente, los PropertyEditors deberían arrojar resultados impredecibles en condiciones altamente concurrentes.

Pero no estoy seguro de por qué Spring utilizó PropertyEditors en primer lugar. ¿Puede ser que se haya diseñado para entornos y hebras que no sean de múltiples hilos antes de SpringMVC?

EDIT:

Aunque, PropertyEditorSupport no se ve Muelle recuperador del hilo de seguridad asegura su usado de una manera segura hilo. Por ejemplo, se invoca initBinder() cada vez que se necesita el enlace de datos. Me equivoqué con la idea de que solo se llama una vez cuando se inicializa el controlador.

@InitBinder 
public void initBinder(WebDataBinder binder) { 

    logger.info("initBinder() called."); 

    DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm"); 
    dateFormat.setLenient(false); 

    binder.registerCustomEditor(Date.class, new CustomDateEditor(
      dateFormat, false)); 
} 

Aquí el registro "initBinder() llamado." puede aparecer varias veces cada vez que se produce el enlace.

Cuestiones relacionadas