2012-02-07 13 views
5

Sto riscontrando un po 'di confusione nell'uso e nello scopo di DataBinder e ConversionService di Spring per quanto riguarda le richieste Web di associazione ai modelli di oggetti. Ciò è dovuto al fatto che recentemente ho provato ad utilizzare la convalida JSR-303 aggiungendo.Differenza tra DataBinder e ConversionService in primavera

Prima di questo ho usato:

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

Questo è stato buono perché volevo una DataBinder globale che potrebbe essere utilizzato da diversi controllori. All'interno della classe GlobalWebBindingInitialzer implementare alcuni di questi:

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

Tuttavia ho voluto usare l'annotazione @Valid e così aggiunsi. L'effetto collaterale di ciò è che il suddetto bean AnnotationMethodHandlerAdapter è già definito come parte dell'annotazione e quindi il mio raccoglitore globale di dati viene ignorato.

Così ora ho creato questa classe:

public class MyClassConverter implements Converter<String, MyClass> 

Sono confuso. Se voglio usare dovrei usare il servizio di conversione piuttosto che il databinder?

risposta

3

Storicamente il collegamento dati di Spring è stato utilizzato per convertire i dati in javabeans. Fa molto affidamento sui PropertyEditor JavaBean per eseguire la conversione.

Spring 3.0 added new and different support per conversioni e formattazione. Alcune delle modifiche includevano un pacchetto "core.convert" e un pacchetto "format" che, come per i documenti, "poteva essere usato come alternativa più semplice ai PropertyEditor".

Ora, per rispondere alla tua domanda, sì, sembra che tu sia sulla strada giusta. Puoi continuare a usare entrambi, ma per farla breve in molti casi dovresti essere in grado di usare un convertitore invece di un raccoglitore di dati.

Documentazione su come aggiungere la convalida is available online.

1

Ulteriori risposte sopra PropertyEditors (esp PropertyEditorSupport) non sono thread-safe che è particolarmente richiesto in un ambiente Web in cui ogni richiesta viene servita in un thread separato. In teoria, PropertyEditors dovrebbe produrre risultati imprevedibili in condizioni altamente concorrenziali.

Ma non sono sicuro del motivo per cui Spring ha utilizzato PropertyEditors in primo luogo. Potrebbe essere stato pensato per ambienti e date non multithread prima di SpringMVC?

EDIT:

Sebbene, PropertyEditorSupport non sembra thread-safe Spring assicura suo usato in modo sicuro thread. Ad esempio, initBinder() viene chiamato ogni volta che è necessario il binding dei dati. Mi sbagliavo sul concetto che è stato chiamato una sola volta quando il controller è inizializzato.

@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)); 
} 

Qui il registro "initBinder() chiamato". può presentarsi più volte ogni volta che si verifica l'associazione.